Namespaces
Variants

std::move_only_function

cppreference.net에서 가져옴
 
 
유틸리티 라이브러리
일반 유틸리티
관계 연산자 (C++20에서 폐기됨)
정수 비교 함수
(C++20)(C++20)(C++20)    
(C++20)
스왑 및 타입 연산
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
공통 어휘 타입
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
함수 객체
함수 호출
(C++17)(C++23)
항등 함수 객체
(C++20)
투명 연산자 래퍼
(C++14)
(C++14)
(C++14)
(C++14)  
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)

이전 바인더 및 어댑터
(C++17까지*)
(C++17까지*)
(C++17까지*)
(C++17까지*)  
(C++17까지*)
(C++17까지*)(C++17까지*)(C++17까지*)(C++17까지*)
(C++20까지*)
(C++20까지*)
(C++17까지*)(C++17까지*)
(C++17까지*)(C++17까지*)

(C++17까지*)
(C++17까지*)(C++17까지*)(C++17까지*)(C++17까지*)
(C++20까지*)
(C++20까지*)
 
 
헤더 <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)

비멤버 함수

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