2

我试图通过一个简单的示例(如下)来了解 std::move 的方式。基本上我试图将 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 EMPTY\n";
    // prints I'M NOT EMPTY     
}
4

3 回答 3

2

移动函数不能保证清除源对象的内容。但是,可以保证将其保留在您可以安全地销毁它或为其分配新值的状态。

于 2013-04-01T10:42:17.490 回答
1

也许这
为什么移动指针变量不会将其设置为空?可以澄清你的代码中发生了什么。正如 riv 指出的那样,没有理由将 std::move 分配给您的指针。

此参考http://en.cppreference.com/w/cpp/utility/move在使用 std::move 时有很好的未定义行为示例。

于 2013-12-19T01:38:39.643 回答
0

不幸的是,std::move它并没有像 C++11 新手经常期望的那样。它被 C++ 标准简单地定义为 a static_cast,因此它本身并没有实际修改给定的对象。通常有一种期望std::move会以某种方式清除或清零被移动的对象,但正如这里所解释的,这根本不是 C++ 标准所要求的。

此外,riv 的回答只是部分正确。他所说的保证与 r没有真正的关系std::move,它与右值引用更相关,并且通常与移动构造函数和移动赋值一起讨论该保证。如果您想了解更多关于std::move、rvalues 等的背景知识,我强烈推荐Thomas Becker 的讨论,它是 Internet 上关于该主题的引用最多的站点之一。

于 2015-09-21T21:51:55.913 回答