gpt4 book ai didi

c++ - 我从一个函数返回未命名的对象。为什么 RVO 仍然启动?

转载 作者:太空狗 更新时间:2023-10-29 23:39:52 25 4
gpt4 key购买 nike

关于此:Why does std::move prevent RVO?有人写道:“因此,只有在表达式是局部变量的名称时,return 语句中才会出现复制省略”

但是我用 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++ - 我从一个函数返回未命名的对象。为什么 RVO 仍然启动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27424255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com