命名空间作用域vs类内部作用域

Namespace scope vs scope inside class

本文关键字:作用域 内部 vs 命名空间      更新时间:2023-10-16

有这样的代码:

namespace N {
   struct B {
      void f() {
         i;
         j;
      }
      int i;
   };
   int j;
}
int main() {
   return 0;
}

找到了变量i,但没有找到变量j。它是如何工作的,类中的变量可以在声明之前使用,但相同的不工作命名空间?如何找到i -编译器首先解析所有类以找到所有成员,然后将其与成员函数的引用绑定?

确实,成员函数体(以及变量初始化式)在类定义之后的阶段处理。通过尝试在其他成员声明中使用成员,您可以自己检查"先声明后使用"规则对类成员是否仍然完全有效:

struct B
{
    char c[sizeof i];
    int i;
};

示范:http://ideone.com/v1ksio

struct B2
{
    decltype(i) f();
    int i;
};

这也会影响类本身的使用,因为它需要一个完整的类型。

struct B
{
    static char c[sizeof (B)];
};

示范:http://ideone.com/Z9XOzm

但是这是可以的,因为变量初始化是在构造定义时处理的,此时所有成员都是已知的,并且类型是完整的:

struct B
{
    unsigned r{sizeof s};
    unsigned s{sizeof (B)};
};