有这个代码:
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)};
};