1

有这个代码:

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

int main() {
   return 0;
}

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

4

1 回答 1

0

实际上,成员函数的主体(以及变量初始化器)是在比类定义更晚的阶段处理的。您可以通过尝试在其他成员声明中使用成员来检查“使用前声明”规则对类成员仍然完全有效:

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)};
};
于 2013-05-03T17:32:25.273 回答