std:: move_only_function
|
헤더 파일에 정의됨
<functional>
|
||
|
template
<
class
...
>
class move_only_function ; // 정의되지 않음 |
(1) | (C++23부터) |
|
template
<
class
R,
class
...
Args
>
class
move_only_function
<
R
(
Args...
)
>
;
|
(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) |
비멤버 함수
|
(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)
|
주어진 호출 시그니처에서 한정자를 지원하는 복사 생성 가능한 모든 호출 가능 객체의 복사 가능 래퍼
(클래스 템플릿) |