我的理解是,当一个基本数据类型被移出时,它总是会执行一次复制。
例如,您永远不能从int中移动,并且不能指定原始int值:
#include <iostream>
int main() {
int x = 100;
int y{std::move(x)};
std::cout << x << " " << y; //always prints "100 100"
}这是否意味着用户定义类型中的基本数据类型也是如此?
#include <iostream>
#include <vector>
struct Foo{
int i = 100;
std::vector<int> vec={1,2,3,4,5}; //something that probably will have an invariant
};
int main() {
Foo x;
Foo y{std::move(x)};
std::cout << x.i << " " << y.i; //always print "100 100"?
}关于在移动后保留这些基本类型值,标准是怎么说的?
发布于 2016-09-26 22:11:14
编译器生成的特殊成员函数被指定为基本上对类的每个成员(和基类)执行相应的操作。
所以你的struct Foo的i将会表现得像一个被移动的int --从vector的.同上。
发布于 2016-09-26 22:01:42
这取决于数据成员的移动构造函数。例如,std::vector的move构造函数通常会将向量留空,但正如您所说,状态是未指定的。
int的状态不会改变,因为它们是可以构造的。编译器将对简单移动的可构造类型执行复制。正如@T.C.在评论中所述,此行为是标准所要求的。
如果您打算在将类移出后使用它,请考虑实现您自己的移动构造函数:
struct Foo {
int i = 100;
std::vector<int> vec={1,2,3,4,5};
Foo(Foo&& foo) noexcept : i{std::move(foo.i)}, vec{std::move(foo.vec)} {
foo.vec = {}; // ensure it's empty
foo.i = 0; // ensure it's 0
}
};https://stackoverflow.com/questions/39704648
复制相似问题