C++ 具名要求:可移动构造 (MoveConstructible) (C++11 起)
来自cppreference.com
指定该类型的实例可以从一个右值实参构造。
要求
以下情况下,类型 T
满足可移动构造 (MoveConstructible) :
给定
-
T
类型的右值表达式rv
- 任意标识符
u
下列表达式必须合法且拥有其指定的效果。
表达式 | 后条件 |
---|---|
T u = rv; | u 的值等于 rv 在初始化前的值。rv 的新值未指明。
|
T(rv) | T(rv) 的值等于 rv 在初始化前的值。rv 的新值未指明。
|
注解
类不必为满足此要求而实现移动构造函数:接收 const T&
实参的复制构造函数也能绑定右值表达式。
若可移动构造 (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); // 类 `S` 并不满足可移动构造(MoveConstructible)的要求 // `u` 的值*并不*等价于 `v` 在初始化 `u` 之前的值 std::cout << "u.n = " << u.n << '\n'; } 输出: v.n = 1 u.n = 2 |
引用
延伸内容 |
---|
|
参阅
(C++11)(C++11)(C++11) |
检查类型是否能从右值引用构造 (类模板) |
(C++20) |
指定能移动构造一个类型的对象 (概念) |