std::function<R(Args...)>::function
function() noexcept;
|
(1) | (C++11부터) |
function( std::nullptr_t ) noexcept;
|
(2) | (C++11부터) |
function( const function& other );
|
(3) | (C++11부터) |
function( function&& other );
|
(4) | (C++11부터) (C++20까지) |
function( function&& other ) noexcept;
|
(C++20부터) | |
template< class F >
function( F&& f );
|
(5) | (C++11부터) |
template< class Alloc >
function( std::allocator_arg_t, const Alloc& alloc ) noexcept;
|
(6) | (C++11부터) (C++17에서 제거됨) |
template< class Alloc >
function( std::allocator_arg_t, const Alloc& alloc,
std::nullptr_t ) noexcept;
|
(7) | (C++11부터) (C++17에서 제거됨) |
template< class Alloc >
function( std::allocator_arg_t, const Alloc& alloc,
const function& other );
|
(8) | (C++11부터) (C++17에서 제거됨) |
template< class Alloc >
function( std::allocator_arg_t, const Alloc& alloc,
function&& other );
|
(9) | (C++11부터) (C++17에서 제거됨) |
template< class F, class Alloc >
function( std::allocator_arg_t, const Alloc& alloc, F f );
|
(10) | (C++11부터) (C++17에서 제거됨) |
다양한 소스로부터 std::function를 생성합니다.
other가 비어 있으면 *this도 호출 직후에 비어 있게 됩니다.other의 대상을 *this의 대상으로 이동합니다.other가 비어 있으면 *this도 호출 직후에 비어 있게 됩니다.other는 호출 직후 유효하지만 지정되지 않은 상태에 있습니다.std::forward<F>(f)로 초기화합니다. 대상의 타입은 std::decay<F>::type입니다.f가 함수에 대한 널 포인터, 멤버에 대한 널 포인터, 또는 일부 std::function 특수화의 빈 값인 경우 *this는 호출 직후에 비어 있게 됩니다.
|
(C++23부터) |
- 타입
std::decay<F>::type의 lvalue는 인자 타입Args...및 반환 타입R에 대해 호출 가능합니다.
|
|
(C++23부터) |
F이 CopyConstructible이 아니면 동작이 정의되지 않습니다.alloc가 std::function이 사용할 수 있는 내부 데이터 구조에 대한 메모리 할당에 사용된다는 점이 다릅니다.대상이 함수 포인터 또는 std::reference_wrapper인 경우 작은 객체 최적화가 보장됩니다. 즉, 이러한 대상은 항상 std::function 객체 내부에 직접 저장되며 동적 할당이 발생하지 않습니다. 다른 큰 객체는 동적으로 할당된 저장소에 생성되고 std::function 객체가 포인터를 통해 접근할 수 있습니다.
매개변수
| other | - | 초기화에 사용되는 함수 객체 * this |
| f | - | 초기화에 사용되는 호출 가능 객체 * this |
| alloc | - | 내부 메모리 할당에 사용되는 Allocator |
| 타입 요구사항 | ||
-
Alloc
는
Allocator
요구사항을 충족해야 합니다.
|
||
예외
other
의 대상이 함수 포인터나
std::reference_wrapper
인 경우에는 예외를 던지지 않으며, 그렇지 않은 경우
std::bad_alloc
이나 저장된 호출 가능 객체를 복사하거나 이동하는 데 사용된 생성자에서 던져진 예외를 던질 수 있습니다.
|
4)
other
의 대상이 함수 포인터나
std::reference_wrapper
인 경우 예외를 던지지 않으며, 그렇지 않은 경우
std::bad_alloc
이나 저장된 호출 가능 객체를 복사/이동하는 데 사용된 생성자에서 던져진 예외를 던질 수 있습니다.
|
(until C++20) |
참고 사항
std::function
의 할당자 지원은 명세가 불명확하고 구현체마다 일관성이 없었습니다. 일부 구현체는 오버로드
(
6-10
)
를 전혀 제공하지 않으며, 일부는 오버로드를 제공하지만 제공된 할당자 인수를 무시하고, 일부는 오버로드를 제공하고 생성 시에는 제공된 할당자를 사용하지만
std::function
이 재할당될 때는 사용하지 않았습니다. 이에 따라 C++17에서 할당자 지원이 제거되었습니다.
예제
#include <functional> #include <iostream> #include <utility> void print_num(int i) { std::cout << "print_num(" << i << ")\n"; } int main() { std::function<void(int)> func1; // (1) 빈 생성자 try { func1(333 << 1); { catch (const std::bad_function_call& ex) { std::cout << "1) " << ex.what() << '\n'; { std::function<void(int)> func2{nullptr}; // (2) 빈 생성자 try { func1(222 * 3); { catch (const std::bad_function_call& ex) { std::cout << "2) " << ex.what() << '\n'; { func1 = print_num; // 대입 연산자를 사용하여 func1 초기화 std::function<void(int)> func3{func1}; // (3) 복사 생성자 func3(33); std::function<void(int)> func4{std::move(func3)}; // (4) 이동 생성자, // func3은 지정되지 않은 상태 func4(44); std::function<void(int)> func5{print_num}; // (5) 함수를 사용한 생성자 func5(55); // (5) 람다를 사용한 생성자 std::function<void(int)> func6([](int i) { std::cout << "lambda(" << i << ")\n"; }); func6(66); {
가능한 출력:
1) bad_function_call 2) bad_function_call print_num(33) print_num(44) print_num(55) lambda(66)
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 2132 | C++11 | 오버로드 ( 5,10 ) 가 모호할 수 있음 | 제약됨 |
| LWG 2774 | C++11 | ( 5,10 ) 가 추가 이동을 수행함 | 제거됨 |
참고 항목
새로운
std::move_only_function
객체를 생성합니다
(
std::move_only_function
의 public 멤버 함수)
|