8

auto&&左辺値を返す関数を処理するために使用する場合:

int func()
{
   int v=42;
   return v;
}

auto && v = func();

v左辺値の代わりに参照として扱うことの結果は何ですか? これらの結果は、関数の戻り値の型の一般的な処理を実行するdecltype(auto)代わりにを使用することを正当化しますか?auto&&

4

1 に答える 1

9

auto&&は、関数の戻り値を取得するのにすでに最適であるため、 の違いはdecltype(auto)欠点になるだけです。あなたの例では、関数から返された一時的なオブジェクトに有効期間の延長が適用されます。これにより、直接名前が付けられたオブジェクトと本質的に同じように動作し、参照修飾子が「消去」されるという効果があります。

値渡し関数で使用decltype(auto)すると、その戻り値オブジェクトがローカルに移動されます。関数の内容によっては、ローカルと一時の区別をなくすコピー省略が適用される場合があります。しかし、参照にバインドされた有効期間の延長は無条件であるのに対し、それは時々適用されるだけです。

適用された場合でも、コピー省略は、戻りオブジェクトをコピーまたは移動できるという要件を削除しません。decltype(auto)関数の戻り値から移動不可能な型のオブジェクトを初期化することはできませんauto &&が、ローカルと一時の区別をローカルの有効期間でモジュロすることはできます。

たまたま、その区別は によってのみ行うことdecltypeができ、ローカル スコープの外でのみ行うことができますdecltype(auto)。通常、有効期間が延長されたオブジェクトをローカルとして扱いたいstd::decayため、 を使用するときは括弧と s に注意し、関数パラメーター ( の最も一般的なアプリケーション) にはdecltype使用しないことをお勧めします。decltype(auto)auto &&

于 2013-11-20T10:08:09.117 に答える