“额外资格”错误。标准是否保证了这些错误?

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"

自gcc v4.1以来,已经对这些错误进行了诊断。但是流行的编译器在这些错误方面并不完全一致。MSVC++ 2012(Nov CTP)在int ::y;处报错,但即使使用/Wall,也不会在int x::i;上发出诊断——这就是那个不幸的提问者所提出的问题类型——这种差异表明了MS编译器编写者的故意考虑。

如果这些错误被标准所允许,那么它们是如何被允许的?引用C++11标准即可。

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


2
我认为这是一个重复的问题。这是非法的(根据我在重复问题中的答案中引用的内容),但它将被允许在C++1y中(请参见litb的回答中的链接)。 - jrok
我同意我复制了链接的问题,并且它非常有帮助。 - Mike Kinghan
1
@jrok 这是一个不同的问题。在这个问题中显示的内容在C++14中是无效的。 - Johannes Schaub - litb
2个回答

5

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

您不能使用限定名称首先声明变量或成员 - 这将导致类似于“无法解析标识符”的编译器错误。此类限定符旨在用于重新声明。因此,需要找到先前声明的实体。


@Johannes Schaub - litb 是的,它是8.3,请修改后我会接受。 - Mike Kinghan

0

在Microsoft编译器中允许在struct x的定义中使用x::i是一个错误。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提供作用域。变量的作用域由其声明位置决定,因此尝试使用作用域说明符声明某些内容就相当于在其他地方声明它,这是无效的。


我是“要求在C++标准中提供证据”。 jrok提供了相关的问题。尽管示例中的作用域解析是多余的,实际上违反了C++11的规定,但您自己的理解是不正确的。变量的作用域由其声明位置决定,但作用域解析运算符仅尝试指定其左侧操作数所在的作用域,对于在作用域x中的x::i或在全局命名空间中的::y来说,它们并不是“其他地方”,而是假定声明的作用域。 - Mike Kinghan
我试图解释,你不能混合使用作用域解析符和定义,因为它们是不兼容的。 - cdmh
只有当标准规定时,它们才是不兼容的。在我写C++的大部分时间里,这样的定义是合法和常见的;然后它们变得非法了,而且在C++14中似乎又将重新变得合法。http://www.fourmilab.ch/fourmilog/archives/2006-05/000699.html - Mike Kinghan
是的,@jrok的参考链接https://dev59.com/HXXYa4cB1Zd3GeqP2RlS#17958535显示标准禁止在`class x内部使用int x::i;`。您引用了一个七年前的抱怨,没有描述这是否有效,只是抱怨多年前的gcc实现。我错过了什么吗? - cdmh
你忽略了我两次要求提供标准证据,而是给出了自己的谬误a priori理由。你没有回答问题。链接的旧抱怨是随机选择的证据,表明违反那个a priori理由的代码一直被编写和编译,直到被标准禁止。这就是我要说的。如果你仍然认为你的答案不差,就对它进行任意编辑,这将允许我取消我的负评。 - Mike Kinghan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接