#include <iostream>
struct Foo{
int i = 10;
};
Foo useless_move(Foo &&f){
return f;
}
int main() {
Foo f = Foo();
f.i = 100;
Foo f1 = useless_move(std::move(f));
std::cout << f.i;
std::cout << f1.i;
}
为什么在使用 Foo f1 = useless_move(std::move(f));
移动值后我仍然可以访问 f 难道我没有将所有权从 f 转移到 f1 吗?
最佳答案
编写 std::move
并不会神奇地让移动发生;从这个意义上说,它的名字真的很糟糕。它所做的只是为您提供一个右值引用。
当您传递对具有移动构造函数的对象的右值引用时,就会发生移动,该构造函数用于交换容器和文件句柄等间接资源,而不是深度复制它们(或根本无法正确复制它们)。
在这种情况下,您只有一个 int
。
没有移动构造函数,没有要移动的东西,也没有执行任何移动。
而且即使有,刚从中移出的对象的状态也是未指定的,不能保证是……好吧,不管你期望的是什么。
关于c++ - 为什么我仍然可以访问已移动的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25129247/