web-dev-qa-db-ja.com

関数から戻るときのautoとdecltype(auto)の違いは何ですか?

decltype(auto)はめったに表示されませんが、関数から戻るときにautoと同じことをするように見えるため、混乱します。

auto g() { return expr; }
decltype(auto) g() { return expr; }

これら2つの構文の違いは何ですか?

45
template boy

autoはテンプレート引数の推論規則に従い、常にオブジェクトタイプです。 decltype(auto)は、値のカテゴリに基づいて参照型を推定するためのdecltypeルールに従います。だから私たちが持っているなら

int x;
int && f();

その後

expression    auto       decltype(auto)
----------------------------------------
10            int        int
x             int        int
(x)           int        int &
f()           int        int &&
48
Kerrek SB

autoは、return句をauto変数に割り当てた場合に推定される値型を返します。 decltype(auto)は、return句をdecltypeでラップした場合に取得するタイプを返します。

autoは値で返しますが、decltypeはそうではないかもしれません。