Namespaces
Variants

C++ named requirements: MoveConstructible (since C++11)

From cppreference.net
C++ named requirements

해당 타입의 인스턴스가 rvalue 인수로부터 생성될 수 있음을 지정합니다.

목차

요구사항

타입 T 가 다음 조건을 만족하면 MoveConstructible 을 만족합니다

주어진

  • rv , rvalue 타입 T 의 표현식,
  • u , 임의의 식별자.

다음 표현식들은 유효해야 하며 지정된 효과를 가져야 합니다.

Expression Post-conditions
T u = rv ; u 의 값은 초기화 전 rv 의 값과 동일합니다.

rv 의 새로운 값은 지정되지 않습니다.

T ( rv ) T(rv) 의 값은 초기화 전 rv 의 값과 동일합니다.

rv 의 새로운 값은 지정되지 않습니다.

참고 사항

클래스가 이 타입 요구사항을 충족하기 위해 move constructor 를 구현할 필요는 없습니다: const T& 인자를 받는 copy constructor 가 rvalue 표현식을 바인딩할 수 있습니다.

만약 MoveConstructible 클래스가 이동 생성자를 구현한다면, 생성 후 rv 의 값이 지정되지 않는다는 사실을 활용하기 위해 이동 의미론 도 구현할 수 있습니다.

확장된 내용

MoveConstructible 클래스는 std::is_move_constructible 를 의미하지만, 그 역은 성립하지 않습니다. 왜냐하면 std::is_move_constructible 는 올바른 인자로 생성자를 호출할 수 있는 능력만을 확인할 뿐, 사후 조건 값은 확인하지 않기 때문입니다.

#include <iostream>
struct S
{
    int n;
    S(int in) : n{in} {}
    S(S&& other) { n = other.n + 1; }
};
static_assert(std::is_move_constructible_v<S>);
int main()
{
    S v{1};
    std::cout << "v.n = " << v.n << '\n';
    S u = std::move(v);
    // Class `S` doesn't satisfy a MoveConstructible requirement
    // The value of `u` is NOT equivalent to the value of `v` before the `u` initialization
    std::cout << "u.n = " << u.n << '\n';
}

출력:

v.n = 1
u.n = 2

참조문헌

확장 콘텐츠
  • C++23 표준 (ISO/IEC 14882:2024):
  • 16.4.4.2 템플릿 인수 요구사항 [utility.arg.requirements]

참고 항목

타입이 우측값 참조로부터 생성될 수 있는지 확인합니다
(클래스 템플릿)
타입의 객체가 이동 생성될 수 있음을 명시합니다
(컨셉)