2026/01/15(木)cpprefjpを読もう。【decltype】

C++11 decltype [N2343] cpprefjp

仕様

C++11の機能、指定した式の型を取得できる。

typeofと何が違うのかと思ったのだが、typeofは非標準な仕様らしい。
知らなかった...
C言語ではC23にて標準仕様に取り込まれたらしい。(めちゃ最近の話だ...)

typeof演算子 in 標準C - yohhoyの日記 - はてなブログ
typeofと比較して仕様の違い。
  1. 参照の扱い

    • decltypeはオペランドの型にある参照を保存する。
    • typeofはオペランドの型にある参照を外す。
      wandbox
      左辺値への参照型に対して型を取得した場合、
      decltype(int&)int&を示し、
      typeof(int&)intを示す
  2. 使用可能な場所

    • typeofは変数宣言時のみ使用可能
    • decltypeは型名が使用できる場所はどこでも使用可能
  3. オペランドの種類

    • typeofは式と型を使用可能
      例) typeof(int)typeof(a + b)

    • decltypeは式のみ使用可能
      例) decltype(a + b)
追記

C++11の以下機能の組み合わせで使用しているのを見かける
変数の型推論のための auto
decltype
戻り値の型を後置する関数宣言構文

auto function(int a, int b) -> decltype(a + b)
{
    return a + b;
}