我现在正在回顾C ++中的微妙观点。我发现了一个有趣的问题。你可以检查一下,并分享你为什么会这样工作的原因。
谢谢
const int x = 5;
void func() {
// ! Error
// int x = x;
// ! Fine
int x[x];
x[0] = 12;
cout << x[0];
}
答案 0 :(得分:7)
变量的声明点(即,名称假定声明赋予它的含义的点,隐藏在更宽范围内具有相同名称的任何其他实体)来自声明者之后,任何初始化者。所以这个:
int x = x;
^ point of declaration
使用自己的未初始化值初始化局部变量x
,给出未定义的行为(尽管它仍然是格式良好的,因此编译器不应该拒绝它,除非你要求它。)
虽然这个:
int x[x];
^ point of declaration
在声明符中使用全局常量x
,它是格式良好且定义良好的。这对于人类读者来说可能是令人困惑的,但编译器没有问题。
这条规则的基本原理是在自己的初始化器中使用变量的地址(但不是值)是合理的,一个简单的例子是
void * p = &p;