无法使用std :: move移动内容

时间:2013-04-01 10:20:45

标签: c++ std move move-semantics

我试图通过一个简单的例子(下面)了解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     
}

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

也许这个 Why does moving a pointer variable not set it to null?可以澄清代码中发生的事情。正如riv指出的那样,没有理由将std :: move赋值给你的指针。

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

答案 2 :(得分:0)

不幸的是,std::move并没有做C ++ 11新手经常期待的事情。它由C ++标准简单地定义为static_cast,因此它本身并没有实际修改它给出的对象。通常期望std::move以某种方式清除或清除被移动的对象,但是explained here,这完全不是C ++标准所要求的。

此外,riv的回答只是部分正确。他所讨论的保证与std::move没有关系,它与rvalue引用更相关,保证通常与移动构造函数和移动赋值一起讨论。如果您想了解std::move,rvalues等的更多背景信息,我强烈推荐Thomas Becker's discussion,这是互联网上被引用最多的网站之一。

相关问题