【问题标题】:failed to move contents with std::move无法使用 std::move 移动内容
【发布时间】:2013-04-01 10:20:45
【问题描述】:

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

【问题讨论】:

    标签: c++ std move move-semantics


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      也许这
      Why does moving a pointer variable not set it to null? 可以阐明您的代码中发生了什么。正如 riv 指出的那样,没有理由将 std::move 分配给您的指针。

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

      【讨论】:

        【解决方案3】:

        不幸的是,std::move 并没有达到 C++11 新手通常期望的效果。它被 C++ 标准简单地定义为static_cast,因此它本身并没有实际修改它所给定的对象。人们通常期望std::move 会以某种方式清除或清零被移动的对象,但作为explained here,这根本不是C++ 标准所要求的。

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

        【讨论】:

          猜你喜欢
          • 2015-09-21
          • 2011-07-28
          • 2011-07-28
          • 2019-07-14
          • 1970-01-01
          • 2021-08-26
          • 1970-01-01
          • 2012-01-02
          • 2018-05-09
          相关资源
          最近更新 更多