キーワード.decltypeを紹介します
同様のキーワードautoキーワードをDecltypeますが、違いがありますが、autoキーワードが初期化された自動変数によって、コンパイル時に代表されるタイプを決定するために使用されます。その後、私たちは、変数のこのタイプを取得したい場合は、しかし、そうか、言い換えれば、表現の自動修正は、変数初期化されていなければなりませんか?ターンdecltypeを果たした今回は、decltypeキーワードは、コンパイル時に式をタイプを推測するために使用されますが、この表現は初期化されたりされていない、コンパイラはあまり影響を与えることはありません。
ここでのキーワードdecltypeキーワードを使用した例です。
書式#include <iostreamの> 使用して 名前空間はstdを、 INT のmain() { int型のx = 0 。 decltype(X)、Y = 1。 // Y - > int型 はcout << Y << てendl; decltype(X + Y)Z = 2。// Z - > int型 はcout << Z << てendl; const int型&I =のX; decltype(I)J = Y。 // J - >のconst int型& coutの << J << てendl; CONST decltype(Z)* P =&Z。 // * P - > decltype(Z)= PI *&Z; // * PI - > INT、PI-> INT * decltype(PI)* = PP&PI; // * PP - > INT *、PP-> INT ** COUT << PP ENDL <<; // 印刷結果:0x61fe80 COUT PP * << ENDL <<; // 印刷結果:0x61fe84 COUT PP ** << ENDL <<; //は結果印刷:2 戻り 0 ; }
あぁ、およびzの結果は、decltypeは直接変数式のタイプに基づいて推定することができ示しており、この機能多くの自動車のように、しかし、あなたがしたい場合は、別の、自動式のみ派生変数は、変数の初期化の種類に応じて必要があります表現のいくつかのタイプを介して取得するのではなく、新しい変数を望んでいないと、この式は同じ値を持ち、これは時に自動として有用ではありません。
結果は、得られた発現のBJ decltypeの種類によって、正確decltype発現がない自動車とのようないくつかのケースで参照廃棄ように、型自体を定義導出することができる、発現およびconst参照を保持することができることを示しますCV修飾子。
Cpは、パイの結果は、decltypeは、オート、プラスの参照やポインタ、およびCV修飾子のように、のようにすることができます示しています。
説明D.pp導出は、式がポインタである場合、decltypeはまだ実際の型(ポインタ型)式を推定することができ、ポインタマークPP定義の結合後、PP得られた二次元のポインタ型であります
二.decltype推論規則
次のようにdecltyp(EXP)の導出規則は以下のとおりです。
(1)識別子発現およびアクセスクラス表現。
(2)関数は、(非識別子の表現、またアクセス式の種類)を呼び出します。
(3)括弧式と式加算器(その他)
まず最初の場合は、次のとおりです。
#include <iostreamの> 使用して 名前空間STD; クラステスト { 公共: 試験(){} パブリック: 静的 CONST INT nNumber = 0 ; int型X; }; int型のmain() { // クラスアクセス発現 decltype(テスト:: nNumber )C = 10 ; テストテスト; decltype(test.xの)D = 20であり、 COUT << C << " " << D << ENDL; // 識別子発現INT Y = 20 ; Decltype(S) = 30 。 リターン 0 ; }
後者の場合:関数呼び出し
#include <iostreamの> 使用して名前空間STD; クラステスト { 公共: 試験(){} 公共: INT m_nNum = - 10 ; }; int型 Test_Intを(); // 純粋右辺値INT&Test_Int_One(); //左値CONST INT Test_Cint(); // 純粋右辺値のconst int型&Test_Cint_One(); // 左値CONSTテストはtest_class(); // 右辺値純粋INT のmain() { int型 X = 10 ; decltype(Test_Int())A1 = xと; // A1-> int型 はcout << A1 << てendl; decltype(Test_Cint_One())A2 = xと; // A2-> int型& int型のy = A2。 COUT << Y << ENDL。 coutの << A2 << てendl; decltype(Test_Cint())B1 = xと; // B1->のconst int型 B1 = 20 ; coutの << B1 << てendl; decltype(Test_Cint_One())B2 = xと; // B2->のconst int型& // B2 = 30; エラー:ちょうど読み取り専用参照B2、もはや値に割り当てることができない COUTのB2を<< << ENDL、 decltype(はtest_class())C1は = )(試験; COUT << c1.m_nNum << ENDL; 戻り 0 ; }
戻り値型は、ルール2およびdecltype一貫した派生関数の結果によれば、関数がint純粋右辺値、純粋のために正しい値を返すため代わりB1では、int型のconst int型であることに留意すべきであることがわかります言葉は、唯一のクラス・タイプは、通常、無視CV修飾子に加えて、CV修飾子を運ぶことができ、したがって、推定B1がintであり、C1派生型がconstの試験であるdecltype。