【发布时间】:2017-05-19 04:39:07
【问题描述】:
下面的sn-p编译(demo):
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; 中声明,而是在 struct A 的定义中声明在main()。
在第二个示例中,struct A 也不是首先在 elaborated-type-specifier struct A; 中声明,而是在 struct A 的定义中在全球范围内。
【问题讨论】:
-
为什么
language-lawyer标签被删除了? -
我想了解为什么@RyanHaining 首先将其删除。也许他是有原因的。
-
当然有一些灰色地带。我在 C++ 语言律师问题中看到的总体趋势是编译器不同意,或者编译的程序没有保证它们是明确定义的行为。这些将是“语言律师”讨论哪个编译器行为正确,或者程序是否符合定义良好的标准要求的地方。由于您应该从此代码收到准确的错误消息,因此 IMO 它超出了通常与 [language-lawyer] 发布的内容
-
实际上,这似乎不太适合 language-lawyer 标签。标准很明确,sn-p 格式不正确。就这样。我的两分钱。
-
@RyanHaining AFAIK language-lawyer 只是表示,OP 希望从官方标准中获得准确的参考,以澄清问题中发生的情况。因此,可以使用所述标签询问有关 任何 行为的问题,无论您是否觉得它们有趣。
标签: c++ language-lawyer declaration definition name-lookup