使用std::move移动内容失败

failed to move contents with std::move

本文关键字:失败 move std 使用 移动      更新时间:2023-10-16

我试图用一个简单的例子(下面)来理解std::是如何移动的。基本上,我试图将p1的内容移动到p2,所以之后p1是空的,但这并没有发生。

我猜我没有正确使用std::move。如果有人能给我解释一下,我会很感激的。

#include <iostream>
#include <utility>
int main()
{
    int * p1 = new int[10];
    for(int i = 0; i < 10; ++i)
        p1[i]=i;
    // moving contents of p1 to p2  
    int * p2 = std::move(p1);   
    // I was expeting p1 now to be empty but it's not...
    if(p1 != NULL)
        std::cout << "I'M NOT EMPTYn";
    // prints I'M NOT EMPTY     
}

move函数不能保证清除源对象的内容。但是,它保证保持在这样一种状态,您可以安全地销毁它或为它赋一个新值。

也许这个
为什么移动指针变量不设置为空?可以澄清代码中发生了什么。正如riv所指出的,std::move没有理由将指针赋值为NULL。

这个参考http://en.cppreference.com/w/cpp/utility/move有使用std::move时未定义行为的好例子。

不幸的是,std::move没有实现c++ 11新手通常期望的功能。c++标准将其定义为简单的static_cast,因此它本身并不实际修改给定的对象。通常期望std::move会以某种方式清除或零化正在移动的对象,但正如这里所解释的,这根本不是c++标准所要求的。

同样,riv的答案只有部分正确。他所说的保证并不是真正与std::move有关,它更多地与右值引用有关,并且保证通常与move构造函数和move赋值一起讨论。如果你想了解更多关于std::move,右值等的背景知识,我强烈推荐Thomas Becker的讨论,这是互联网上关于该主题的最受参考的网站之一。