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 이후) |
| (4) | ||
|
function
(
function
&&
other
)
;
|
(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,
|
(7) |
(C++11부터)
(C++17에서 제거됨) |
|
template
<
class
Alloc
>
function
(
std::
allocator_arg_t
,
const
Alloc
&
alloc,
|
(8) |
(C++11부터)
(C++17에서 제거됨) |
|
template
<
class
Alloc
>
function
(
std::
allocator_arg_t
,
const
Alloc
&
alloc,
|
(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
을 생성합니다.
std::function
특수화의 빈 값이라면,
*
this
는 호출 직후 빈 상태가 될 것입니다.
|
(C++23부터) |
-
std::
decay
<
F
>
::
type
타입의 lvalue가 인수 타입
Args...와 반환 타입R에 대해 호출 가능한 경우.
|
만약 std:: is_copy_constructible_v < std:: decay_t < F >> 또는 std:: is_constructible_v < std:: decay_t < F > , F > 가 false 인 경우, 프로그램은 ill-formed입니다. |
(C++23부터) |
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 멤버 함수)
|