C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++の型推論を解説:autoとdecltypeの基本と使い方

本記事では、C++における型推論(Type Inference)について、autoキーワードとdecltypeキーワードの2つを中心に詳しく解説します。

C++11以降、型推論機能が導入されたことで、プログラマは明示的に型名を書かずに済むようになり、コードの可読性と保守性が大幅に向上しました。

autoキーワードによる型推論

autoは、変数の初期化子(initializer)から変数の型を自動的に推論するキーワードです。初期化時に代入される値の型に基づいて、コンパイラが適切な型を決定します。

以下の例では、整数・浮動小数点数・ポインタそれぞれに対してautoを使用し、typeid().name()で推論された型を出力しています。

サンプルコード

#include <bits/stdc++.h>
using namespace std;

int main(){
    auto x = 4;      // int 型として推論される
    auto y = 3.37;   // double 型として推論される
    auto ptr = &x;   // int* 型として推論される

    cout << typeid(x).name() << endl
         << typeid(y).name() << endl
         << typeid(ptr).name() << endl;

    return 0;
}

実行結果

i
d
Pi

出力の意味は次のとおりです(GCC系コンパイラの型名表記)。

  • i … int型
  • d … double型
  • Pi … intへのポインタ(Pointer to int)型

decltypeキーワードによる型推論

decltypeは、指定した式や関数呼び出しからその型を抽出するキーワードです。autoとは異なり、実際に値を評価せずに、式の宣言時の型を取得できる点が特徴です。

以下の例では、戻り値の異なる2つの関数に対してdecltypeを使用し、それぞれの戻り値の型を持つ変数を宣言しています。

サンプルコード

#include <bits/stdc++.h>
using namespace std;

int fun1() { return 10; }
char fun2() { return 'g'; }

int main(){
    decltype(fun1()) x;  // int 型として推論される
    decltype(fun2()) y;  // char 型として推論される

    cout << typeid(x).name() << endl;
    cout << typeid(y).name() << endl;

    return 0;
}

実行結果

i
c

出力の意味は次のとおりです。

  • i … int型(fun1の戻り値の型)
  • c … char型(fun2の戻り値の型)

autoとdecltypeの使い分けのポイント

  • auto:変数の初期化子から型を推論したい場合に使用します。反復処理でのイテレータ宣言など、長い型名を省略できる場面で特に有効です。
  • decltype:式の型だけを取得したい場合に使用します。テンプレートメタプログラミングや、関数の戻り値の型に依存する変数宣言などで活躍します。

両者を適切に使い分けることで、より簡潔で安全なC++コードを書くことができます。

  1. C++の変数とは?基本の変数宣言と主なデータ型をわかりやすく解説

    変数(へんすう)とは、プログラムが操作できる「名前付きの記憶領域」のことです。C++では、各変数に必ず特定の「型」が割り当てられます。この型によって、次の3つの要素が決まります。変数のメモリ上のサイズと配置そのメモリに格納できる値の範囲その変数に適用できる演算(操作)の種類最もシンプルな変数の例を見てみましょう。int my_val = 5;この例では、int型(整数型)の変数 my_val を宣言し、値として 5 を代入しています。変数の宣言方法C++で変数を定義する一般的な書式は次のとおりです。type variable_name;宣言と同時に初期化したい場合は、以下のように記述します。t

  2. C++のautoキーワードとは?型推論の仕組みと使い方を徹底解説

    C++におけるautoキーワードは、C言語から「引き継がれた」歴史あるキーワードでした。しかし、長い間ほとんど使われることはありませんでした。状況が大きく変わったのは、C++11でautoが「文脈から型を推論する」機能を持つようになってからです。C++11以前では、すべてのデータ型をコンパイル時に明示的に宣言する必要がありました。そのため、プログラマーは式の型を常に意識してコードを書く必要があり、特に複雑なイテレータ型などを扱う際には記述が冗長になりがちでした。しかし新しいバージョンのC++では、型推論をコンパイラ自身に任せられるキーワードが導入され、プログラマーの負担が大幅に軽減されました。