这适用于 GCC 和 Comeau:
struct X {};
void X() {}
这打破了科莫:
struct X {};
template< typename T >
void X() {}
这打破了两者:
template< typename T >
struct X {};
template< typename T >
void X() {}
该规则由 §3.3.7/2 定义。差异仅仅是因为函数模板不是函数吗?我无法理解 GCC 的行为。
类名 (9.1) 或枚举名 (7.2) 可以被同一范围内声明的变量、数据成员、函数或枚举数的名称隐藏。如果一个类或枚举名称和一个变量、数据成员、函数或枚举器在同一范围内(以任何顺序)以相同名称声明,则无论变量、数据成员、函数或枚举器名称可见。