C++Prime:decltypeタイプインジケータ

2117 ワード

decltypeの役割は、オペランドのデータ型を選択して返すことです.
  decltype(f()) sum = x;//sumのタイプは関数fの戻りタイプです
decltypeが使用する式が変数である場合、decltypeはその変数のタイプ(最上位constとconstを含む)を返します.
const int ci=0, &cj = ci;

decltype(ci) x = 0;    // x    const int

decltype(cj) y = x;    // y    const int&,y     x

decltype(cj) z;    //   ,z     ,     

 
decltypeが使用する式が変数でない場合、decltypeは式の結果に対応するタイプを返します.
// decltype          

int i = 42, *p = &i, &r = i;

decltype(r+0) b;    //   ,      int,  b        int

decltype(*p) c;    //   ,c int&,     

rは参照であるためdecltype(r)の結果は参照タイプである.結果タイプをrが指すタイプにするには、r+0のような式の一部としてrを使用します.この式の結果は参照ではなく特定の値になることは明らかです.
一方、式の内容が解参照操作である場合、decltypeは参照タイプを得る.したがってdecltype(*p)の結果タイプはintではなくint&である.
decltypeで使用される式では、変数名にカッコを1対付けた場合、カッコを付けない場合と異なるタイプが得られます.decltypeがカッコを付けない変数を使用している場合、結果はその変数のタイプです.変数にカッコまたは多層カッコを付けると、コンパイラは式として扱われます.変数は、付与文の左の値として使用できる特殊な式であるため、decltypeは参照タイプを取得します.
// decltype              ,      

decltype((i)) d;    //   ,d int&,     

decltype(i) e;    //   ,e        int