C++ named requirements: MoveConstructible (since C++11)
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
해당 타입의 인스턴스가 rvalue 인수로부터 생성될 수 있음을 지정합니다.
목차 |
요구사항
타입
T
가 다음 조건을 만족하면
MoveConstructible
을 만족합니다
주어진
-
rv, rvalue 타입T의 표현식, -
u, 임의의 식별자.
다음 표현식들은 유효해야 하며 지정된 효과를 가져야 합니다.
| Expression | Post-conditions |
|---|---|
| T u = rv ; |
u
의 값은 초기화 전
rv
의 값과 동일합니다.
|
| T ( rv ) |
T(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++11)
(C++11)
(C++11)
|
타입이 우측값 참조로부터 생성될 수 있는지 확인합니다
(클래스 템플릿) |
|
(C++20)
|
타입의 객체가 이동 생성될 수 있음을 명시합니다
(컨셉) |