"额外资格"错误。标准如何保证?

时间:2013-08-03 09:18:49

标签: c++ c++11 compiler-errors standards qualified-name

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 标准就足够了。

答案可能是“他们遵循语法”。在这种情况下, 请尝试展示他们如何遵循语法并随意使用 标准的语法分类。我有一份副本,会重新阅读 了解解释。

2 个答案:

答案 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#detailshttps://connect.microsoft.com/VisualStudio/feedback/details/794504/keyword-struct-before-constructor-name)。

它无效的原因是因为您正在尝试声明变量int i并使用x::i提供范围。变量的范围由声明,其中声明,因此尝试声明具有范围规范的东西是试图在其他地方声明它,这是无效的。