Decltypeの適切な説明を見つけることができませんでした。初心者プログラマーとして、それが何をするのか、なぜそれが有用なのか教えてください。
たとえば、私は次の質問をした本を読んでいます。誰かが私にその答えと理由を説明できますか、いくつかの良い(初心者レベル)例と一緒に?
コードが完了すると、各変数の型と各変数の値は何になりますか?
int a = 3, b = 4; decltype(a) c = a; decltype((b)) d = a; ++c; ++d;
行ごとの説明が非常に役立ちます。
decltype
はタイプを指定する方法です。式を指定すると、decltype
は式のタイプに対応するタイプを返します。具体的には、decltype(e)
は次のタイプです。
e
が変数の名前、つまり「id-expression」の場合、結果の型は変数の型になります。
それ以外の場合、e
がT
型の左辺値に評価される場合、結果の型は_T &
_であり、e
がT
の場合、結果の型はT
になります。
これらのルールを参照折りたたみルールと組み合わせると、常に「適切な」参照であるdecltype(e) &&
を理解することができます。 (C++ 14はdecltype(auto)
も追加して、auto
の型推論をdecltype
の値カテゴリセマンティクスと組み合わせて提供します。)
例:
_int foo();
int n = 10;
decltype(n) a = 20; // a is an "int" [id-expression]
decltype((n)) b = a; // b is an "int &" [(n) is an lvalue]
decltype(foo()) c = foo(); // c is an "int" [rvalue]
decltype(foo()) && r1 = foo(); // int &&
decltype((n)) && r2 = n; // int &
_
auto
とdecltype
の違いを強調する価値があるかもしれません:auto
はtypesで動作し、decltype
は動作します- 式。
「日常的な」プログラミングでdecltype
を表示したり使用したりしてはなりません。これは、問題の式が不明でパラメーターに依存する一般的な(テンプレート化された)ライブラリコードで最も役立ちます。 (対照的に、auto
はあちこちで寛大に使用できます。)つまり、プログラミングに慣れていない場合は、しばらくの間decltype
を使用する必要はないでしょう。