#include <iostream>
int C;
class C {
private:
int i[2];
public:
static int f() {
return sizeof(C);
}
};
int f()
{
return sizeof(C); // why the C can't be the class type C.
}
int main()
{
std::cout << "C::f() = " <<C::f() << ","
<< " ::f() = " <<::f() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码返回: C::f() = 8, ::f() = 4
我的问题是为什么C全局函数中的标识符f解析为int具有名称C 的类型的对象,而不是类类型C?是否sizeof有特定的名称查找规则?
结论:根据我在/sf/answers/42873351/中的内容,通过函数/对象/枚举器名称隐藏类名是为了兼容C的问题.为了避免这种无意的隐藏,应该typedef是类强制编译错误.
eer*_*ika 20
sizeof不是这个问题的关键.它恰好是可以在类型名称或变量名称上使用的东西.这些规则也适用于标识符的其他用途.
§9.1[class.name](c ++标准草案n3797):
- ... snip ...如果在声明了同名变量,函数或枚举数的作用域中声明了类名,那么当两个声明都在作用域中时,只能使用详细说明来引用该类.型说明符.
C在全局范围内有一个名称和一个同名的变量.因此,只能使用精心设计的类型说明符(class C)来引用该类.
C但是,在该定义的内容中,该段的第一部分是相关的:
§9.1[class.name]:
- 类声明将类名引入声明它的范围,并在封闭范围内隐藏该名称的任何类,变量,函数或其他声明... snip ...
§9[班级]:
- ... snip ...类名也插入到类本身的范围内; 这被称为注入类名...剪切...
因此,在范围内class C,注入的类名称隐藏int C了外部范围的声明.因此,您可以参考C没有详细说明的类型说明符.要引用全局int C,您可以使用::C