decltype(デクルタイプ)とは
C++11で採用された機能。
オペランドで指定した式の型を取得する。
decltypeはlvalue / rvalueも考慮する。
変数での使用
decltype(i) j = 0; // j はiの型
decltype(i)* p = &i; // p はi*型
decltype((i)) r = i; // r はi&型
decltype((i)) はiが式として評価(lvalue)され参照型となる。
関数の戻り値として使用
template<typename T, typename U>
auto add(const T& l, const U& r)
-> decltype(l + r); // addの戻り値の型は`l + r`
decltype(auto)
C++14から
decltypeに与える式を右辺の式で置き換えて型推論する機能
decltype(auto) d = a + b; // `auto`がa + bで置き換えられる。
関数の戻り値として使用
template<typename T>
decltype(auto) f(T& r){
return r; // T&が戻り値型に
}
autoとの違い
autoは値から推論する(参照、constなどが落ちる)
decltypeは式自体を推論する(参照、constがそのまま)
int x;
int y = &x;
auto z = y; // int型
decltype(auto) b = rx; // int&型
参考文献
- N1478-Decltype and auto
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1478.pdf - decltype [N2343]-cpprefjp
https://cpprefjp.github.io/lang/cpp11/decltype.html - decltype(auto)-cpprefjp
https://cpprefjp.github.io/lang/cpp14/decltype_auto.html