-1

在下面的示例中,为什么在 fun 内部的 'copy' 构造中不调用 move 构造函数,即使 'fun' 的 '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
4

1 回答 1

0

WhileBob && b是一个右值引用,构造后所有命名的数据使用都将其用作左值。

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

获得右值引用的唯一方法是:

  • 没有名称的值,例如临时返回值或强制转换的结果。

  • return x;在简单语句中使用局部值变量。

  • 显式转换为右值,例如 withstd::movestd::forward

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

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

于 2014-05-11T14:46:22.577 回答