移动构造函数不被调用? (C ++ 11)

时间:2014-05-11 13:30:35

标签: c++11 move-constructor

在下面的例子中,为什么移动构造函数在构造' copy'内心有趣,即使是“src'有趣的论点'是明确的右值引用,仅用于该构造吗?

struct Toy {
    int data;

    Toy(): data(0)
    {
        log("Constructed");
    }

    Toy(Toy const& src): data(src.data)
    {
        log("Copy-constructed");
    }

    Toy(Toy&& src): data(src.data)
    {
        log("Move-constructed");
    }
};

Toy fun(Toy&& src)
{
    Toy copy(src);
    copy.data = 777;
    return copy;
}

Toy toy(fun(Toy())); // LOG: Constructed Copy-constructed

1 个答案:

答案 0 :(得分:0)

虽然Bob && b是右值引用,但构造后所有命名的数据使用都将其用作左值。

所以Bob&& b只会绑定到右值,但是当你使用它时,它会移动。

获得右值参考的唯一方法是:

  • 没有名称的值,例如临时返回值或演员表的结果。

  • 在简单的return x;语句中使用本地值变量。

  • 明确地转换为右边距,例如使用std::movestd::forward

这可以防止数据从一行静默移动,然后在下一行上使用。将rvalue视为'我是程序员说在使用此表达式后不需要这个',并且'只接受事后不需要的东西'在函数参数中是有帮助的。上面的临时/​​返回异常是编译器可以相对安全地保证这一点的两个点。

最后,请注意,通用引用(auto&&T&&)看起来像是右值引用,但有时不是。