Namespaces
Variants

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

From cppreference.net
Utilities library
Function objects
Function invocation
(C++17) (C++23)
Identity function object
(C++20)
Old binders and adaptors
( until C++17* )
( until C++17* )
( until C++17* )
( until C++17* )
( until C++17* ) ( until C++17* ) ( until C++17* ) ( until C++17* )
( until C++20* )
( until C++20* )
( until C++17* ) ( until C++17* )
( until C++17* ) ( until C++17* )

( until C++17* )
( until C++17* ) ( until C++17* ) ( until C++17* ) ( until C++17* )
( until C++20* )
( until C++20* )
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,

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) empty std::function 을 생성합니다.
3) other target * this 의 target으로 복사합니다.
만약 other 가 비어 있으면, * this 도 호출 직후에 비어 있게 됩니다.
4) other 의 대상을 * this 의 대상으로 이동시킵니다.
만약 other 가 비어 있으면, * this 도 호출 직후에 비어 있게 됩니다.
other 호출 직후에 유효하지만 지정되지 않은 상태에 있습니다.
5) 대상 객체를 std:: forward < F > ( f ) 로 초기화합니다. 대상 객체의 타입은 std:: decay < F > :: type 입니다.
만약 f 가 함수에 대한 널 포인터, 멤버에 대한 널 포인터, 또는 어떤 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부터)
만약 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 멤버 함수)