sizeof运算符是否更喜欢对象而不是类型?

Ric*_*ich 13 c++ sizeof

#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):

  1. ... snip ...如果在声明了同名变量,函数或枚举数的作用域中声明了类名,那么当两个声明都在作用域中时,只能使用详细说明来引用该类.型说明符.

C在全局范围内有一个名称和一个同名的变量.因此,只能使用精心设计的类型说明符(class C)来引用该类.

C但是,在该定义的内容中,该段的第一部分是相关的:

§9.1[class.name]:

  1. 类声明将类名引入声明它的范围,并在封闭范围内隐藏该名称的任何类,变量,函数或其他声明... snip ...

§9[班级]:

  1. ... snip ...类名也插入到类本身的范围内; 这被称为注入类名...剪切...

因此,在范围内class C,注入的类名称隐藏int C了外部范围的声明.因此,您可以参考C没有详细说明的类型说明符.要引用全局int C,您可以使用::C