Namespaces
Variants

std:: move_only_function

From cppreference.net
Utilities library
Function objects
Function wrappers
(C++11)
move_only_function
(C++23)
(C++11)
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* )
헤더 파일에 정의됨 <functional>
template < class ... >
class move_only_function ; // 정의되지 않음
(1) (C++23부터)
template < class R, class ... Args >

class move_only_function < R ( Args... ) > ;
template < class R, class ... Args >
class move_only_function < R ( Args... ) noexcept > ;
template < class R, class ... Args >
class move_only_function < R ( Args... ) & > ;
template < class R, class ... Args >
class move_only_function < R ( Args... ) & noexcept > ;
template < class R, class ... Args >
class move_only_function < R ( Args... ) && > ;
template < class R, class ... Args >
class move_only_function < R ( Args... ) && noexcept > ;
template < class R, class ... Args >
class move_only_function < R ( Args... ) const > ;
template < class R, class ... Args >
class move_only_function < R ( Args... ) const noexcept > ;
template < class R, class ... Args >
class move_only_function < R ( Args... ) const & > ;
template < class R, class ... Args >
class move_only_function < R ( Args... ) const & noexcept > ;
template < class R, class ... Args >
class move_only_function < R ( Args... ) const && > ;
template < class R, class ... Args >

class move_only_function < R ( Args... ) const && noexcept > ;
(2) (C++23부터)

클래스 템플릿 std::move_only_function 는 범용 다형 함수 래퍼입니다. std::move_only_function 객체는 생성 가능한(이동 생성이 필수는 아닌) 모든 Callable target — 함수, lambda expressions , bind expressions , 기타 함수 객체, 그리고 멤버 함수 포인터와 멤버 객체 포인터를 저장하고 호출할 수 있습니다.

저장된 호출 가능 객체는 타겟 이라고 합니다. std::move_only_function std::move_only_function 이 타겟을 포함하지 않으면 empty 라고 합니다. std::function 과 달리, empty 상태의 std::move_only_function 을 호출하면 undefined behavior가 발생합니다.

std::move_only_function 은 템플릿 매개변수에 제공된 모든 가능한 조합의 cv-qualifiers ( volatile 제외), ref-qualifiers , 그리고 noexcept-specifiers 를 지원합니다. 이러한 qualifier와 specifier(있는 경우)는 operator() 에 추가됩니다.

std::move_only_function MoveConstructible MoveAssignable 요구 사항을 만족하지만, CopyConstructible 이나 CopyAssignable 는 만족하지 않습니다.

목차

멤버 타입

유형 정의
result_type R

멤버 함수

새로운 std::move_only_function 객체를 생성함
(public member function)
std::move_only_function 객체를 파괴함
(public member function)
대상을 교체하거나 파괴함
(public member function)
std::move_only_function 객체의 대상을 교환함
(public member function)
std::move_only_function 이 대상을 가지고 있는지 확인함
(public member function)
대상을 호출함
(public member function)

비멤버 함수

std::swap 알고리즘을 특수화함
(함수)
(C++23)
std::move_only_function nullptr 을 비교함
(함수)

참고 사항

구현은 작은 크기의 호출 가능 객체를 std::move_only_function 객체 내에 저장할 수 있습니다. 이러한 작은 객체 최적화는 함수 포인터와 std::reference_wrapper 특수화에 대해 사실상 요구되며, std:: is_nothrow_move_constructible_v < T > true 인 타입 T 에만 적용될 수 있습니다.

만약 참조를 반환하는 std::move_only_function 이 prvalue를 반환하는 함수나 함수 객체(후행 반환 타입이 없는 람다 표현식 포함)로 초기화되면, 반환된 참조를 임시 객체에 바인딩하는 것이 금지되어 있으므로 프로그램의 형식이 잘못됩니다. 참고로 std::function Notes도 확인하십시오.

기능 테스트 매크로 표준 기능
__cpp_lib_move_only_function 202110L (C++23) std::move_only_function

예제

#include <functional>
#include <future>
#include <iostream>
int main()
{
    std::packaged_task<double()> packaged_task([](){ return 3.14159; });
    std::future<double> future = packaged_task.get_future();
    auto lambda = [task = std::move(packaged_task)]() mutable { task(); };
//  std::function<void()> function = std::move(lambda); // 오류
    std::move_only_function<void()> function = std::move(lambda); // 정상
    function();
    std::cout << future.get();
}

출력:

3.14159

참고 항목

(C++11)
복사 생성 가능한 모든 호출 가능 객체의 복사 가능 래퍼
(클래스 템플릿)
모든 호출 가능 객체의 비소유 래퍼
(클래스 템플릿)
주어진 호출 시그니처에서 한정자를 지원하는 복사 생성 가능한 모든 호출 가능 객체의 복사 가능 래퍼
(클래스 템플릿)