#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;
}
上面的代码返回:
C::f() = 8, ::f() = 4
我的问题是为什么全局函数f
内部的标识符C
解析为具有名称C的int
类型对象,而不是类类型C
?sizeof
是否具有特定的名称查找规则?结论:从我在https://dev59.com/e3RB5IYBdhLWcg3weHLx#612476中阅读到的内容来看,通过函数/对象/枚举器名称隐藏类名是出于与C兼容性的考虑。为避免这种意外的隐藏,应该使用
typedef
将类强制编译器报错。
sizeof
是用于对象的。类类型C
不是一个对象,而是类的实现。如果你想让全局函数f()
调用类类型C
的对象,你需要初始化一个实例,例如C C;
。 - R Narsizeof
被用于对象上并不一定正确。根据cppreference的描述,sizeof
可以查询对象或类型的大小。 - jaggedSpire