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_functionMoveConstructibleMoveAssignable 요구 사항을 만족하지만, 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_functionnullptr와 비교해요 (함수)

참고 사항 (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) 주어진 호출 시그니처에서 한정자를 지원하는 복사 생성 가능한 모든 호출 가능 객체의 복사 가능 래퍼 (클래스 템플릿)

더 알아보기 (Learn more)

cppreference