c++ - 为什么我仍然可以访问已移动的对象?

标签 c++

#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/

相关文章:

c++ - Qt C++ QRegExp 解析字符串

c++ - 如何以矩阵形式打印2D vector ? C++

c++ - C++中文件数据的动态分配

c++ - Qt 数据类型选择

C++ |重载运算符 << |标准:: map

c++ - 在 Matlab 中使用 OS X 编译/混合 imrender 函数时出错

c++ - 如何使用 move 语义迭代器和模板

c++ - 如何在带有 qmlscene(或 qmlviewer5)的 .qml 上使用 Qt Quick 2 扩展插件

c++ - 打印 NaN 值

c++ - 无法更改 volatile 变量的值