次の型X
と機能がありf
ます。
struct X { ... };
X f() { ... };
ここで、別の関数の 3 つの代替定義を考えますg
。
(1)
void g()
{
X x = f();
...
}
(2)
void g()
{
X& x = f();
...
}
(3)
void g()
{
X&& x = f();
...
}
3 つの異なるケース間で定義された動作 (または潜在的な動作) の違いは何ですか? (プレースホルダー付きの '...' コードは 3 つのケースで同一であると仮定します)
アップデート:
g
が返された場合はどうX
なりますか : 次は合法で正しいですか?
X g()
{
X&& x = f();
...
return move(x);
}
(移動は必要ですか、それは何かをしますか?)
以下が同じコードを生成するように、RVO が連鎖すると思いますか?
X g()
{
X x = f();
...
return x;
}