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

C++のautoとdecltypeとは?型推論の基本をわかりやすく解説

autoとは

autoは、C++11以降で使用できるキーワードで、変数の型を自動的に推論する(型推論)ために使われます。型推論とは、プログラミング言語において式のデータ型を自動的に判別する機能のことで、強い静的型付けを持つ一部の言語に備わっている特徴です。

例えば、vectorを走査するためのイテレータを作成したい場合、autoを使えばシンプルに記述できます。

コード例

#include<iostream>
#include<vector>
using namespace std;
int main() {
    vector<int> arr(10);
    for(auto it = arr.begin(); it != arr.end(); it++) {
        cin >> *it;
    }
    return 0;
}

上記のプログラムでは、itは自動的にstd::vector<int>::iterator型であると推論されます。このように、複雑な型名を明示的に書く必要がなくなり、コードの可読性が向上します。

decltypeとは

decltypeは型指定子の一つで、指定した式の型をそのまま返します。autoが変数に代入される値をもとに型を推論するのに対し、decltypeは引数として渡された式そのものから型を導出する点が大きな違いです。さらに、decltypeが返す型は、そのまま別の変数の定義に利用することもできます。

例えば、先ほどのコードはdecltypeを使うと次のように書き換えられます。

コード例

#include <iostream>
#include <vector>
using namespace std;
int main() {
    vector<int> arr(10);
    for (decltype(arr.begin()) it = arr.begin(); it != arr.end(); it++) {
        cin >> *it;
    }
    return 0;
}

autoとdecltypeの違いに注意しよう

decltypeが表す型は、autoによって推論される型と必ずしも一致するとは限りません。この両者には参照やconst修飾の扱いなど、いくつかの微妙な差異が存在します。より深く理解したい方は、Thomas Becker氏によるC++の型推論に関する詳細な解説記事(全12ページ)を参考にするとよいでしょう。
参考:https://thbecker.net/articles/auto_and_decltype/section_01.html

  1. C++の型指定子とは?基本の使い方を初心者向けに解説

    C++の型指定子(Type Specifier)とは? C++のような静的型付け言語では、変数を最初に宣言する際に、その変数がどの種類のデータを保持するのかを必ず指定しなければなりません。 int number = 42; この例における「int」が型指定子です。これは「number」という変数には整数値しか格納できないことを示しています。 動的型付け言語との違い 一方、RubyやJavaScriptなどの動的型付け言語では、型を事前に宣言する必要がありません。単純に変数を宣言するだけで済みます。 var number = 42; このようにC++では、コンパイルの時点で型が確定するため、実行

  2. C++の型修飾子(type qualifier)とは?const・volatile・restrict・_Atomicをわかりやすく解説

    型修飾子とは何か 型修飾子(type qualifier)とは、ある型に適用することで「修飾型(qualified type)」を生成するキーワードのことです。たとえば const int は定数の整数を表す修飾型であり、それに対応する非修飾型である int は単なる整数を表します。 型修飾子は、型システムを通じて値に関する追加の情報を表現し、データの使用における正しさを保証するための重要な仕組みです。プログラマの意図をコンパイラに伝えることで、誤った操作をコンパイル時に検出できるようになります。 標準Cにおける4つの型修飾子 C11規格の時点で、標準Cには次の4つの型修飾子が存在します。