Namespaces
Variants

std::function<R(Args...)>::function

cppreference.net에서
 
 
유틸리티 라이브러리
일반 유틸리티
관계 연산자 (C++20에서 폐기됨)
정수 비교 함수
(C++20)(C++20)(C++20)    
(C++20)
교환 및 타입 연산
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
공통 어휘 타입
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
함수 객체
함수 호출
(C++17)(C++23)
항등 함수 객체
(C++20)
투명 연산자 래퍼
(C++14)
(C++14)
(C++14)
(C++14)  
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)

이전 바인더 및 어댑터
(C++17까지*)
(C++17까지*)
(C++17까지*)
(C++17까지*)  
(C++17까지*)
(C++17까지*)(C++17까지*)(C++17까지*)(C++17까지*)
(C++20까지*)
(C++20까지*)
(C++17까지*)(C++17까지*)
(C++17까지*)(C++17까지*)

(C++17까지*)
(C++17까지*)(C++17까지*)(C++17까지*)(C++17까지*)
(C++20까지*)
(C++20까지*)
 
 
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를 생성합니다.

1,2) 비어 있는 std::function를 생성합니다.
3) 의 대상other을 *this의 대상으로 복사합니다.
other가 비어 있으면 *this도 호출 직후에 비어 있게 됩니다.
4) other의 대상을 *this의 대상으로 이동합니다.
other가 비어 있으면 *this도 호출 직후에 비어 있게 됩니다.
other는 호출 직후 유효하지만 지정되지 않은 상태에 있습니다.
5) 대상을 std::forward<F>(f)로 초기화합니다. 대상의 타입은 std::decay<F>::type입니다.
f가 함수에 대한 널 포인터, 멤버에 대한 널 포인터, 또는 일부 std::function 특수화의 빈 값인 경우 *this는 호출 직후에 비어 있게 됩니다.
이 오버로드는 다음 조건이 모두 충족되는 경우에만 오버로드 해결에 참여합니다.
  • std::is_same_v<std::remove_cvref_t<F>, std::function<R(Args...)>는 false입니다.
(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인 경우 프로그램이 잘못된 형식입니다.

(C++23부터)
F이 CopyConstructible이 아니면 동작이 정의되지 않습니다.
6-10) (1-5)와 동일하지만, alloc가 std::function이 사용할 수 있는 내부 데이터 구조에 대한 메모리 할당에 사용된다는 점이 다릅니다.

대상이 함수 포인터 또는 std::reference_wrapper인 경우 작은 객체 최적화가 보장됩니다. 즉, 이러한 대상은 항상 std::function 객체 내부에 직접 저장되며 동적 할당이 발생하지 않습니다. 다른 큰 객체는 동적으로 할당된 저장소에 생성되고 std::function 객체가 포인터를 통해 접근할 수 있습니다.

매개변수

other - 초기화에 사용되는 함수 객체 * this
f - 초기화에 사용되는 호출 가능 객체 * this
alloc - 내부 메모리 할당에 사용되는 Allocator
타입 요구사항
-
Alloc 는 Allocator 요구사항을 충족해야 합니다.

예외

3,8,9) other 의 대상이 함수 포인터나 std::reference_wrapper 인 경우에는 예외를 던지지 않으며, 그렇지 않은 경우 std::bad_alloc 이나 저장된 호출 가능 객체를 복사하거나 이동하는 데 사용된 생성자에서 던져진 예외를 던질 수 있습니다.
4) other 의 대상이 함수 포인터나 std::reference_wrapper 인 경우 예외를 던지지 않으며, 그렇지 않은 경우 std::bad_alloc 이나 저장된 호출 가능 객체를 복사/이동하는 데 사용된 생성자에서 던져진 예외를 던질 수 있습니다.
(until C++20)
5,10) f 가 함수 포인터이거나 std::reference_wrapper 인 경우에는 예외를 던지지 않으며, 그렇지 않은 경우에는 std::bad_alloc 이나 저장된 호출 가능 객체의 복사 생성자에 의해 던져지는 모든 예외를 던질 수 있습니다.

참고 사항

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 멤버 함수)