【发布时间】:2015-02-10 00:28:28
【问题描述】:
对此:Why does std::move prevent RVO? 有人写道:“因此,如果表达式是局部变量的名称”,则返回语句中只会出现复制省略”
不过我用 GCC 做了一个小测试:
class X
{
public:
X()
{
cout << "def" << endl;
}
X(const X& x)
{
cout << "copy" << endl;
}
X(X&& x)
{
cout << "move" << endl;
}
};
X produceX()
{
return X();
}
int main()
{
X x{produceX()};
return 0;
}
produceX 函数不返回命名值。它返回一个未命名的临时对象。然而,RVO 仍然启动,并且没有复制或移动构造。 main 中的 x 对象是就地构造的。如果我这样写produceX:
X produceX()
{
X localNamedObject;
return localNamedObject;
}
它的行为方式相同(这是预期的)。但是为什么在前一种情况下允许 RVO 呢?
【问题讨论】:
-
它是允许的,因为 C++ 标准说它是。变量没有必须被命名。引用要么不正确,要么断章取义。
-
因为“因此,如果表达式是局部变量的名称,则只有在返回语句中才会出现复制省略”不正确。