gpt4 book ai didi

C++11 局部命名引用返回值(xvalue)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:30:13 26 4
gpt4 key购买 nike

我们有以下类型 X 和函数 f:

struct X { ... };

X f() { ... };

现在考虑另一个函数 g 的三个替代定义:

(1)

void g()
{
X x = f();

...
}

(2)

void g()
{
X& x = f();

...
}

(3)

void g()
{
X&& x = f();

...
}

三种不同情况下定义的行为(或潜在行为)有何不同? (假设占位符 '...' 代码在三种情况下是相同的)

更新:

如果 g 返回一个 X 会怎样:以下是否合法且正确?

X g()
{
X&& x = f();

...

return move(x);
}

(此举是否必要,是否有任何作用?)

您是否希望 RVO 链接以便下面产生相同的代码?

X g()
{
X x = f();

...

return x;
}

最佳答案

2 是非法的。其他两个本质上是相同的 - x 是类型为 X 的可变左值,其生命周期在 g() 返回时结束。

当然,严格来说,第一个调用移动构造函数(但它是某些 RVO/NRVO 操作的主要候选者)而第三个不调用,所以如果 X 是不可移动的(非常奇怪...),第三个情况是合法的但第一个不是,第一个可能更贵。然而,编译器选项和不可移动类型的现实情况是,这几乎完全是一种技术问题,如果您能实际演示任何此类情况,我会感到惊讶。

关于C++11 局部命名引用返回值(xvalue)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14188181/

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