C++ named requirements: MoveConstructible (since C++11)
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
指定该类型的实例可以从一个 右值 参数构造。
目录 |
要求
类型
T
满足
MoveConstructible
若
给定
-
rv,一个类型为T的 右值 表达式, -
u,任意标识符。
以下表达式必须有效且具有其指定效果。
| 表达式 | 后置条件 |
|---|---|
| T u = rv ; |
u
的值等价于初始化前
rv
的值
|
| T ( rv ) |
T(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`的值不等价 std::cout << "u.n = " << u.n << '\n'; } 输出: v.n = 1 u.n = 2 |
参考文献
| 扩展内容 |
|---|
|
另请参阅
|
(C++11)
(C++11)
(C++11)
|
检查类型是否可以从右值引用构造
(类模板) |
|
(C++20)
|
规定该类型的对象可以移动构造
(概念) |