我们有以下类型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;
}