命名空间范围与类内的范围

时间:2013-05-03 17:10:47

标签: c++ scope

有这段代码:

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

int main() {
   return 0;
}

找到变量i但未找到变量j。如何在类声明之前使用该类中的变量,但这对于名称空间不起作用?如何找到i - 编译器首先解析所有成员然后将其与成员函数的引用绑定?

1 个答案:

答案 0 :(得分: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)};
};