std::move_only_function
| 헤더 <functional>
|
||
template< class... >
class move_only_function; // not defined
|
에 정의됨 (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 객체는 생성 가능(이동 생성 가능일 필요는 없음)한 호출 가능 대상 — 함수, 람다 표현식, 바인드 표현식 또는 기타 함수 객체와 멤버 함수 포인터 및 멤버 객체 포인터를 저장하고 호출할 수 있습니다.
저장된 호출 가능 객체를 대상이라고 합니다. std::move_only_function의. std::move_only_function에 대상이 없으면 비어 있음이라고 합니다. std::function과 달리 비어 있음 std::move_only_function을 호출하면 정의되지 않은 동작이 발생합니다.
std::move_only_function는 템플릿 매개변수에 제공된 모든 가능한 조합의 cv-한정사(volatile 제외), 참조 한정사 및 noexcept-지정자를 지원합니다. 이러한 한정사와 지정자(있는 경우)는 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) |
비멤버 함수
|
(C++23)
|
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)
|
복사 생성 가능한 모든 호출 가능 객체의 복사 가능 래퍼
(클래스 템플릿) |
|
(C++26)
|
모든 호출 가능 객체의 비소유 래퍼
(클래스 템플릿) |
|
(C++26)
|
주어진 호출 시그니처에서 한정자를 지원하는 복사 생성 가능한 모든 호출 가능 객체의 복사 가능 래퍼
(클래스 템플릿) |