关于这一点:为什么 std::move 会阻止 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;
}
producerX 函数不返回命名值。它返回一个未命名的临时对象。然而,RVO 仍然启动,并且没有复制或移动构造。main 中的 x 对象是就地构造的。如果我这样写produceX:
X produceX()
{
X localNamedObject;
return localNamedObject;
}
它的行为方式相同(这是预期的)。但是为什么在前一种情况下允许 RVO 呢?