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