web-dev-qa-db-ja.com

decltypeとは何ですか?

Decltypeの適切な説明を見つけることができませんでした。初心者プログラマーとして、それが何をするのか、なぜそれが有用なのか教えてください。

たとえば、私は次の質問をした本を読んでいます。誰かが私にその答えと理由を説明できますか、いくつかの良い(初心者レベル)例と一緒に?

コードが完了すると、各変数の型と各変数の値は何になりますか?

int a = 3, b = 4;    
decltype(a) c = a;

decltype((b)) d = a; 

++c; 

++d;

行ごとの説明が非常に役立ちます。

45
Olpers

decltypeはタイプを指定する方法です。を指定すると、decltypeは式のタイプに対応するタイプを返します。具体的には、decltype(e)は次のタイプです。

  • eが変数の名前、つまり「id-expression」の場合、結果の型は変数の型になります。

  • それ以外の場合、eT型の左辺値に評価される場合、結果の型は_T &_であり、eTの場合、結果の型は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 &
_

autodecltypeの違いを強調する価値があるかもしれません:autotypesで動作し、decltypeは動作します-

「日常的な」プログラミングでdecltypeを表示したり使用したりしてはなりません。これは、問題の式が不明でパラメーターに依存する一般的な(テンプレート化された)ライブラリコードで最も役立ちます。 (対照的に、autoはあちこちで寛大に使用できます。)つまり、プログラミングに慣れていない場合は、しばらくの間decltypeを使用する必要はないでしょう。

67
Kerrek SB