#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
我的问题是,为什么全局函数C中的标识符f解析为名称为C的int类型的对象,而不是类C的对象? sizeof是否具有特定的名称查找规则?

结论:从我在https://stackoverflow.com/a/612476/1021388中阅读的内容来看,按函数/对象/枚举器名称隐藏类名称是为了与C兼容。为了避免这种无意的隐藏,应使用typedef类强制编译器错误。

最佳答案

sizeof不是这个问题的关键。它恰好是可以在类型名或变量名上使用的东西。这些规则也适用于标识符的其他用途。

§9.1[class.name](c++标准草案n3797):



在全局范围内,有一个名为C的类和一个同名的变量。因此,只能使用详细的类型说明符(class C)来引用该类。

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

第9.1节[class.name]:



§9[类别]:



因此,在class C的作用域内,注入(inject)的类名对外部作用域隐藏int C声明。因此,您可以在没有详细的类型说明符的情况下引用C。要引用全局int C,可以使用::C

关于c++ - sizeof运算符比类型更喜欢对象吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33350002/

10-11 23:18
查看更多