以下代码片段可以被编译(演示):
struct A{ int i = 10; };
int main() {
struct A{ int i = 20; };
struct A;
struct A a;
}
但是这个不会:struct A{ int i = 10; };
int main() {
// struct A{ int i = 20; };
struct A;
struct A a;
}
我可以看到,答案可能就在标准的这些段落中:
[basic.lookup.elab]/2 和 [basic.scope.pdecl]/7。
但是我真的不知道如何从这两个段落中推导出上面所展示的不同行为。
请注意,在第一个示例中,struct A
并不是在elaborated-type-specifier struct A;
中首次声明的,而是在main()
函数中struct A
的定义中声明的。
在第二个示例中,struct A
也不是在elaborated-type-specifier struct A;
中首次声明的,而是在全局作用域中struct A
的定义中声明的。
language-lawyer
是一种与语言无关的标签,这似乎是在 C++ 中会被删除的问题类型。我并不反对它符合所述要求的说法。如果我在这里是少数派,那没关系,因为现在它已经回来了。 - Ryan Haining