This similar ill-fated question 得到评论和简短的答案,在它关闭之前,效果:因为那是 如何定义语言。我在这里要求提供证据 C ++标准,如此定义。
gcc 4.8.1和clang 3.3一样,默认诊断选项或更严格, 为额外资格或显式资格提供错误 代码如:
struct x
{
int x::i; // Error: gcc/clang: "extra"
};
int ::y; // Error: gcc: "explicit", clang: "extra"
自从v4.1以来,gcc已经诊断出这样的错误。但流行的编译器不是
对这些错误一致。 MSVC ++ 2012(11月CTP)
在int ::y;
处出现错误,但即使使用/Wall
,也不会给出任何诊断
int x::i;
- 命运多了的提问者所提出的案件 -
这种差异表明了MS编译器编写者的审议。
标准如何保证这些错误,如果是的话?参考C ++ 11 标准就足够了。
答案可能是“他们遵循语法”。在这种情况下, 请尝试展示他们如何遵循语法并随意使用 标准的语法分类。我有一份副本,会重新阅读 了解解释。
答案 0 :(得分:5)
C ++中的限定名称始终必须引用先前声明的名称。这在第8.3和3.4.3.2节中规定。
您不能首先使用限定名称声明变量或成员 - 它最终将以“无法解析标识符” - 良好的编译器错误结束。此类限定符旨在用于重新声明。因此要求这些名称必须找到先前声明的实体。
答案 1 :(得分:0)
Microsoft编译器中的一个错误是在x::i
的定义中允许struct x
。 MSVC前端中存在多个这些错误,并且已向Microsoft报告,但它们已关闭而未修复(请参阅此处报告的类似但不同的错误:https://connect.microsoft.com/VisualStudio/feedback/details/783433/c-compiler-accepts-explicit-constructor-call#details和https://connect.microsoft.com/VisualStudio/feedback/details/794504/keyword-struct-before-constructor-name)。
它无效的原因是因为您正在尝试声明变量int i
并使用x::i
提供范围。变量的范围由声明,其中声明,因此尝试声明具有范围规范的东西是试图在其他地方声明它,这是无效的。