5

这个类似的命运多舛的问题 在关闭之前得到了评论和简短的回答,大意是:因为这就是语言的定义方式。在这里,我要求在 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 标准的引用就足够了。

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

4

2 回答 2

5

C++ 中的限定名称始终必须引用先前声明的名称。这在第 8.3 和 3.4.3.2 节中有规定。

您不能首先使用限定名称声明变量或成员 - 它最终会出现“无法解析标识符” - 类似编译器错误。此类限定符旨在用于重新声明。因此要求这些名称必须找到先前声明的实体。

于 2013-08-06T20:52:55.510 回答
0

这是 Microsoft 编译器中的一个错误,允许x::istruct 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. 变量的范围由声明它的位置决定,因此尝试使用范围规范声明某些内容就是尝试在其他地方声明它,这是无效的。

于 2013-08-03T13:00:13.187 回答