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 标准中的以下措辞涵盖了这一点:
[温度.dep.type]/5
一个名字是一个未知专业化的成员,如果它是
- 一个限定 ID,其中嵌套名称说明符命名了一个不是当前实例化的依赖类型。
[温度.dep.type]/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 表达式是依赖于类型的,如果它包含
一个标识符,通过名称查找与使用依赖类型声明的一个或多个声明相关联,
一个依赖的模板ID,
指定依赖类型的转换函数 ID,或
命名未知专业化成员的嵌套名称说明符或限定 ID;
或者,如果它为某些 T 命名当前实例化的具有类型“T 的未知边界数组”的静态数据成员
这表明f(n)
仅当依赖于类型时才依赖n
于类型,而不依赖于类型。n
我错过了什么,或者这是一个编译器错误?