在下面的例子中,为什么移动构造函数在构造' 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
答案 0 :(得分:0)
虽然Bob && b
是右值引用,但构造后所有命名的数据使用都将其用作左值。
所以Bob&& b
只会绑定到右值,但是当你使用它时,它会不移动。
获得右值参考的唯一方法是:
没有名称的值,例如临时返回值或演员表的结果。
在简单的return x;
语句中使用本地值变量。
明确地转换为右边距,例如使用std::move
或std::forward
。
这可以防止数据从一行静默移动,然后在下一行上使用。将rvalue视为'我是程序员说在使用此表达式后不需要这个',并且'只接受事后不需要的东西'在函数参数中是有帮助的。上面的临时/返回异常是编译器可以相对安全地保证这一点的两个点。
最后,请注意,通用引用(auto&&
和T&&
)看起来像是右值引用,但有时不是。