- cpp14[meta cpp]
このページはC++14に採用された言語機能の変更を解説しています。
のちのC++規格でさらに変更される場合があるため関連項目を参照してください。
decltype(auto)
は、decltype
に与える式を右辺の式で置き換えて型推論する機能である。
int a = 3;
int b = 2;
decltype(a + b) c = a + b; // cの型はint
decltype(auto) d = a + b; // dの型もint。autoが式「a + b」で置き換えられる
参照の変数をauto
キーワードで型推論した場合はT
となるが、decltype(auto)
で型推論した場合はT&
となる。
int x = 3;
int& r = x;
auto a = r; // aの型はint
decltype(r) b = r; // bの型はint&
decltype(auto) c = r; // cの型はint&
この機能は、通常関数の戻り値型推論の戻り値型プレースホルダーとしても使用できる:
// autoの場合はintが戻り値型となるが、
// decltype(auto)とすることでint&が戻り値型となる。
decltype(auto) f(int& r)
{
return r;
}
#include <type_traits>
int main()
{
int x = 3;
int& r = x;
auto a = r; // aの型はint
decltype(r) b = r; // bの型はint&
decltype(auto) c = r; // cの型はint&
static_assert(std::is_same<decltype(a), int>::value, "");
static_assert(std::is_same<decltype(b), int&>::value, "");
static_assert(std::is_same<decltype(c), int&>::value, "");
}
decltype(auto)
は、C++14で導入された「通常関数の戻り値型推論」の機能で、参照の変数を参照のままreturn
文で返せるようにするために導入された。