嵌套类中外部类数据成员的可见性为何存在差异?
为什么嵌套类中数组声明的静态成员不可见,但成员初始化时可见?
这是因为C++中类定义的解析顺序和默认成员初始化器的名字查找规则不同导致的:
对于
int arr[n];这种类成员的声明:
类的定义是从上到下逐行解析的,当解析嵌套类B的成员声明时,外部类A的static const int n还没被声明(它在B的定义之后)。在类的成员声明阶段,只有已经在当前类(包括外部类中已声明的成员)中出现过的名字才是可见的,所以这里找不到n,编译报错。对于
int x = n;这种默认成员初始化器:
默认初始化器的表达式并不是在类定义解析阶段就立即查找名字,而是在实际创建对象、执行初始化操作时才求值。此时整个外部类A的定义已经完全完成,n已经被声明并处于作用域内,所以可以正常找到并使用。
如果要让数组声明也能正常使用n,只需要把n的声明移到嵌套类B的前面即可:
struct A { static const int n = 5; struct B { int arr[n]; // 现在n可见,编译正常 int x = n; }; };
内容的提问来源于stack exchange,提问作者mn_op
相关产品推荐
相关产品推荐

