typename
次の例では、clang 3.6 と gcc 5.0 の両方が必要です。
template<typename T>
struct B
{
typedef int Type;
};
void f(int);
template<int n>
struct A
{
typedef typename B<decltype(f(n))>::Type Type;
};
これは、C++11 標準の次の文言でカバーされています。
[温度依存タイプ]/5
名前は、不明な専門分野のメンバーです。
- ネストされた名前指定子が現在のインスタンス化ではない依存型を指定する修飾 ID。
[温度依存タイプ]/8
ある場合、型は従属です。
未知の専門分野のメンバー、
テンプレート名がテンプレート パラメータであるか、いずれかのテンプレート引数が依存型または型依存または値依存の式である simple-template-id
で表され
decltype(expression)
、式は型に依存します
B<decltype(f(n))>::Type
これは、 が型依存である場合にのみ、型依存であることを示唆していB<decltype(f(n))>
ます。また、それは型B<decltype(f(n))>
依存の場合にのみf(n)
依存します。
[temp.dep.expr]/1
以下で説明する場合を除き、部分式が型依存である場合、式は型依存です。
[temp.dep.expr]/3
id-expression が含まれている場合、型に依存します。
依存型で宣言された 1 つまたは複数の宣言を使用した名前ルックアップによって関連付けられた識別子、
依存するテンプレート ID、
依存型を指定する conversion-function-id、または
未知の特殊化のメンバーを指定するネストされた名前指定子または修飾 ID。
または、一部の T に対して「T の未知の範囲の配列」型を持つ現在のインスタンス化の静的データ メンバーを指定する場合
これは、 が型依存であり、それが型依存でないf(n)
場合にのみ、型依存であることを示唆しています。n
n
何か不足していますか、それともコンパイラのバグですか?