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

C ++でのautoとdecltypeの関係は何ですか?


Autoとdecltypeは異なる目的を果たすため、1対1でマッピングされません。 autoは、C ++ 11以降のキーワードであり、自動型推定に使用されます。 decltype型指定子は、指定された式の型を生成します。変数に割り当てられている値に基づいて型を推測するautoとは異なり、decltypeは渡された式から型を推測します。 decltypeによって返される値は、別の変数を定義するために直接使用できます。

autoは、テンプレートパラメータの推定のルールに従います。これらのルールの詳細については、http://en.cppreference.com/w/cpp/language/template_argument_deduction

をご覧ください。

decltypeにはルールがありますが、標準で定義されているとおりに従う必要があります。これらのルールを使用した標準からの抜粋を次に示します。

sizeof演算子と同様に、decltypeのオペランドは評価されません。非公式には、decltype(e)によって返される型は次のように推定されます-

  • 式eがローカルスコープまたは名前空間スコープの変数、静的メンバー変数、または関数パラメーターを参照している場合、結果はその変数またはパラメーターの宣言された型になります
  • eが関数呼び出しまたはオーバーロードされた演算子の呼び出しである場合、decltype(e)はその関数の宣言された戻り型を示します
  • それ以外の場合、eが左辺値の場合、decltype(e)はT&です。ここで、Tはeのタイプです。 eが右辺値の場合、結果はT

これらのセマンティクスは、ジェネリックライブラリライターのニーズを満たすように設計されていますが、同時に、decltypeの戻り型は常にオブジェクトまたは関数の型と正確に一致するため、初心者プログラマーにとって直感的です。ソースコード。より正式には、ルール1は括弧で囲まれていないid式とクラスメンバーアクセス式に適用されます。関数呼び出しの場合、推定型は、過負荷解決のルールによって決定される、静的に選択された関数の戻り型です。

autoとdecltypeを使用した例

#include<iostream>
#include<vector>

using namespace std;

int main() {
    // Using auto for type deduction
    vector<int> arr(10);
    for(auto it = arr.begin(); it != arr.end(); it ++) {
        cin >> *it;
    }

    // Using decltype for type deduction
    vector<int> arr(10);
    for (decltype(arr.begin()) it = arr.begin(); it != arr.end(); it++) {
        cin >> *it;
    }
    return 0;
}

decltypeで示されるタイプは、autoで推定されるタイプとは異なる場合があることに注意してください。これらの微妙な違いについて詳しくは、C ++での型推論に関するこの12ページの説明を参照してください-http://thbecker.net/articles/auto_and_decltype/section_01.html


  1. C ++のドット(。)演算子と->の違いは何ですか?

    ドットと矢印の演算子は、どちらもC++でクラスのメンバーにアクセスするために使用されます。それらはさまざまなシナリオで使用されます。 C ++では、class、struct、またはunionとして宣言された型は、「クラス型」と見なされます。したがって、以下は3つすべてを指します。 a.bは、bがオブジェクトのメンバー(またはオブジェクトへの参照[1])である場合にのみ使用されます。したがって、a.bの場合、aは常にクラスの実際のオブジェクト(またはオブジェクトへの参照)になります。 a→bは基本的に(* a).bの省略表記です。つまり、aがオブジェクトへのポインタである場合、a→bはポイ

  2. 自動キーワードはC++で何をしますか?

    Autoは、C ++がCから「継承」したキーワードであり、ほぼ永久に存在していましたが、実際には使用されていませんでした。これはすべて、C++11のコンテキストから型の推定を行うためのautoの導入によって変更されました。 C ++ 11より前は、各データ型をコンパイル時に明示的に宣言する必要があり、実行時の式の値を制限しますが、C ++の新しいバージョンの後は、プログラマーが型の推定をコンパイラー自体に任せることができる多くのキーワードが含まれています。 型推論機能を使用すると、コンパイラーがすでに知っていることを書き出すために費やす時間を短縮できます。すべての型はコンパイラフェーズでの