C++ 命名需求: MoveConstructible (自 C++11 起)
来自 cppreference.com
指定该类型的实例可以从一个右值参数构造。
内容 |
[编辑] 需求
如果类型 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); // 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) |
指定类型对象可以移动构造 (概念) |