functional_move_only_function
functional_move_only_function (이동 전용 함수 래퍼)
이 페이지에서는 C++23에서 도입된 std::move_only_function 클래스 템플릿에 대해 설명해요. std::move_only_function은 이동만 가능한 범용 다형성 함수 래퍼로, 다양한 호출 가능 객체를 저장하고 호출할 수 있어요. std::function과 달리 복사는 할 수 없지만, 이동은 자유롭게 할 수 있답니다.
출처: cppreference
본문
<functional> 헤더에 정의됨
| 템플릿 선언 | (1) | C++23부터 |
|---|---|---|
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 객체는 생성 가능하고(이동 생성 가능일 필요는 없어요) 호출 가능한 대상(Callable target) — 함수, 람다 표현식, 바인드 표현식, 또는 다른 함수 객체, 멤버 함수 포인터와 멤버 객체 포인터 — 을 저장하고 호출할 수 있어요.
저장된 호출 가능 객체를 std::move_only_function의 대상(target)이라고 해요. std::move_only_function에 대상이 없으면 비어 있다(empty)고 해요. std::function과 달리 비어 있는 std::move_only_function을 호출하면 동작이 정의되지 않아요(undefined behavior).
std::move_only_function은 템플릿 매개변수에 제공된 cv 한정자(volatile 제외), ref 한정자, noexcept 지정자의 모든 가능한 조합을 지원해요. 이러한 한정자와 지정자는 operator()에 추가돼요.
std::move_only_function은 MoveConstructible과 MoveAssignable 요구 사항을 만족하지만, CopyConstructible이나 CopyAssignable은 만족하지 않아요.
멤버 유형 (Member types)
| 유형 | 정의 |
|---|---|
| result_type | R |
멤버 함수 (Member functions)
| 함수 | 설명 |
|---|---|
| (생성자) | 새로운 std::move_only_function 객체를 생성해요 (공개 멤버 함수) |
| (소멸자) | std::move_only_function 객체를 소멸해요 (공개 멤버 함수) |
| operator= | 대상을 교체하거나 소멸해요 (공개 멤버 함수) |
| swap | 두 std::move_only_function 객체의 대상을 교환해요 (공개 멤버 함수) |
| operator bool | std::move_only_function에 대상이 있는지 확인해요 (공개 멤버 함수) |
| operator() | 대상을 호출해요 (공개 멤버 함수) |
비멤버 함수 (Non-member functions)
| 함수 | 설명 |
|---|---|
| swap (std::move_only_function) (C++23) | std::swap 알고리즘을 특수화해요 (함수) |
| operator== (C++23) | std::move_only_function을 nullptr와 비교해요 (함수) |
참고 사항 (Notes)
구현은 작은 크기의 호출 가능 객체를 std::move_only_function 객체 내부에 저장할 수 있어요. 이러한 소형 객체 최적화는 함수 포인터와 std::reference_wrapper 특수화에 사실상 필요하며, std::is_nothrow_move_constructible_v<T>가 true인 타입 T에만 적용할 수 있어요.
참조를 반환하는 std::move_only_function이 prvalue를 반환하는 함수나 함수 객체(후행 반환 타입이 없는 람다 표현식 포함)로부터 초기화되면, 반환된 참조를 임시 객체에 바인딩하는 것이 금지되므로 프로그램은 ill-formed예요. std::function의 참고 사항도 함께 보세요.
| 기능 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
| __cpp_lib_move_only_function | 202110L | (C++23) | std::move_only_function |
예제 (Example)
#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); // Error
std::move_only_function<void()> function = std::move(lambda); // OK
function();
std::cout << future.get();
}
출력:
3.14159
같이 보기 (See also)
| 함수 | 설명 |
|---|---|
| function (C++11) | 복사 생성 가능한 모든 호출 가능 객체의 복사 가능 래퍼 (클래스 템플릿) |
| function_ref (C++26) | 모든 호출 가능 객체의 비소유 래퍼 (클래스 템플릿) |
| copyable_function (C++26) | 주어진 호출 시그니처에서 한정자를 지원하는 복사 생성 가능한 모든 호출 가능 객체의 복사 가능 래퍼 (클래스 템플릿) |