我有以下代码,使用gcc 4.4编译时没有警告,并返回42。
template<typename T>
struct foo
{ };
template<typename T>
struct foo<void (T)>
{
enum { value = 42 };
};
int main()
{
return foo<void ((int))>::value;
}
现在我明白了,当模板参数为时为何会起作用,但双括号是怎么回事呢?这在C++中是否合法?它和一样吗?
谢谢。
我有以下代码,使用gcc 4.4编译时没有警告,并返回42。
template<typename T>
struct foo
{ };
template<typename T>
struct foo<void (T)>
{
enum { value = 42 };
};
int main()
{
return foo<void ((int))>::value;
}
void ((int))
与 void (int)
相同。foo<void ((int))>
中的 void ((int))
部分被称为 type-id
。type-id
由 type-specifier-seq
和 abstract-declarator
组成。void ((int))
中,type-specifier-seq
是 void
,abstract-declarator
是 ((int))
,并且 abstract-declarator
可以任意加括号。void ((int))
是一个有趣的类型标识符,意味着在有趣的声明 void (g(int))
中声明了类型 g
,其含义与更常见的声明 void g(int)
相同。 - ascheplervoid f((int)) {}
?我怀疑原始示例是无效的语法,并且它被接受是编译器错误。 - ascheplerint
开始表达式评估,它不再像函数规范那样。 - Mark Ransom模板与宏定义不同。
你的 "void (T)" 与 "void T" 相同,"void ((int))" 与 "void int" 相同,就像 "void ((((int))))" 与 "void int" 相同。括号中的表达式会被计算,正如 @Mark 指出的那样。
(expr,)
将是一个单元素元组,但(expr)
只是expr
。在Python中,简单地用括号包装某些东西并不会改变它的任何内容,就像在任何明智的语言中一样。 - user395760template <>
吗? - Adrian McCarthy