【问题标题】:std::move on a stack objectstd::move 在堆栈对象上
【发布时间】:2016-10-05 18:01:25
【问题描述】:

我知道这是一个非常基本,甚至可能令人尴尬的问题,但我无法理解这一点。如果我 std::move 从堆栈上的某个对象到另一个对象,当原始对象超出范围时,另一个对象是否仍然可以使用?

#include <iostream>
#include <string>

int
main(int argc, char* argv[])
{
    std::string outer_scope;

    {
        std::string inner_scope = "candy";
        outer_scope = std::move(inner_scope);
    }

    std::cout << outer_scope << std::endl;

    return 0;
}

outer_scope 在我尝试打印的地方仍然有效吗?

【问题讨论】:

  • 当然可以。移动构造函数/赋值的全部目的是从临时对象中窃取内容——如果这样构造的对象在相关临时对象死亡后无法使用,那将是非常无用的。
  • 如果你移动了某个东西,那么这意味着你移动它的东西现在处于控制之中,而原来控制的东西不再控制。
  • 当然是
  • @πάνταῥεῖ 嗯?该代码对我来说看起来非常简单且没有争议。在您看来,它违反了哪条规则?
  • @IgorTandetnik 对不起,我误解了反之亦然的行动。不过,有一个骗局。

标签: c++ c++11 move-semantics


【解决方案1】:

是的,它仍然有效,内部范围对象失去了之前拥有的内容的所有权,外部范围成为所有者。 std::move 就像一个向量交换。如果交换外部和内部,销毁内部不会影响外部现在拥有的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-04
    • 2017-08-21
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2013-01-25
    相关资源
    最近更新 更多