使用 Clang 3.0 -std=c++98 编译,接受以下代码:
template<int>
struct I
{
typedef int Type;
};
template<class>
struct S
{
static int f(int);
//static int f(int*);
// implicitly instantiates I<sizeof(int)>
typedef I<sizeof(f(0))>::Type Type;
};
S<int>::Type s;
取消注释 'f' 的重载会导致 Clang 报告错误“在依赖类型名称之前缺少 'typename'”。G++ 4.8 报告有或没有重载的相同错误。无论有没有过载,msvc10 都不会给出任何错误。
标准在哪里说明“f”是否依赖以及是否需要“typename”?如果不需要'typename',标准在哪里说明在这种情况下是否应该执行重载解析?
编辑:
澄清一下:我提到重载解析的原因是可能需要执行重载解析来确定常量表达式“sizeof(f(0))”的值。如果(我假设)在确定表达式是否依赖于类型时不执行重载决议,那么常量表达式“sizeof(f(0))”的值是不可能确定的(在解析时)何时依赖重载'f' 存在:例如
template<int>
struct I
{
typedef int Type;
};
template<class T>
struct S
{
static T f(int);
typedef typename I<sizeof(f(0))>::Type Type;
};
S<int>::Type t;
使用 Clang 3.0 -std=c++98 编译,不会产生错误。这对我来说似乎是正确的,因为如果一个表达式是一个 id 表达式,它命名一个用依赖类型声明的对象,那么标准认为它是依赖于类型的。