C++Prime:decltypeタイプインジケータ
2117 ワード
decltypeの役割は、オペランドのデータ型を選択して返すことです.
decltype(f()) sum = x;//sumのタイプは関数fの戻りタイプです
decltypeが使用する式が変数である場合、decltypeはその変数のタイプ(最上位constとconstを含む)を返します.
decltypeが使用する式が変数でない場合、decltypeは式の結果に対応するタイプを返します.
rは参照であるためdecltype(r)の結果は参照タイプである.結果タイプをrが指すタイプにするには、r+0のような式の一部としてrを使用します.この式の結果は参照ではなく特定の値になることは明らかです.
一方、式の内容が解参照操作である場合、decltypeは参照タイプを得る.したがってdecltype(*p)の結果タイプはintではなくint&である.
decltypeで使用される式では、変数名にカッコを1対付けた場合、カッコを付けない場合と異なるタイプが得られます.decltypeがカッコを付けない変数を使用している場合、結果はその変数のタイプです.変数にカッコまたは多層カッコを付けると、コンパイラは式として扱われます.変数は、付与文の左の値として使用できる特殊な式であるため、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