【发布时间】:2014-05-11 13:30:35
【问题描述】:
在下面的示例中,为什么在 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
【问题讨论】:
-
顺便说一句,您的示例既不完整也不可用,下次发布其他人可以使用的内容,而不仅仅是随机的 sn-ps,似乎可以从您的预期中复制您的问题。
-
我不明白复制省略或返回值优化与函数内部构造“复制”对象的方式有什么关系。发生的事情显然是违反直觉和适得其反的。
-
代码注释表明永远不会调用移动构造函数。该问题提到“src”参数是一个右值引用并用于在“fun”中构造“复制”对象,我认为这足以让这里的聪明人理解我期望移动构造发生的位置。 -_-