为什么"int&const"与MSVC编译良好?

iva*_*ult 3 c++ visual-studio language-lawyer

请考虑以下代码:

int a = 1;
/* Note that const is on the right here */
int & const b = a;
Run Code Online (Sandbox Code Playgroud)

当然,它没有任何意义(因为引用就像非空常量指针),但是这个代码在MSVC 2015和MSVC 2017中编译得很好.GCC和Clang无法按预期编译它:

错误:'const'限定符不能应用于'int&'

这是有意的吗?这是一个错误吗?

int a = 1;
int const const const & const const const const b = a;
Run Code Online (Sandbox Code Playgroud)

这段代码编译也很好.

Chr*_*ckl 6

它不会编译罚款.我的Visual C++说(而且只是编译/nologo /EHsc,没有额外的警告,没有/permissive-):

warning C4227: anachronism used: qualifiers on reference are ignored
Run Code Online (Sandbox Code Playgroud)

在第二个例子中,它说:

warning C4114: same type qualifier used more than once
Run Code Online (Sandbox Code Playgroud)

你还想要什么?这显然不是一个错误,因为错误的代码被明确识别.编译器可能接受它以避免遗留代码的问题,但只要产生诊断消息,编译器就会以完全符合标准的方式运行.你不要忽视警告,如果你愿意,你可以将它们视为错误(Visual C++也有一个编译器标志来为你做这件事).

  • @ivaigult:标准在警告和错误之间正式没有区别.如果编译器打印出诊断消息,那么它是否也生成二进制文件并不重要.仅诊断消息就足以满足标准的要求.另见§4.1/ 2.2:*"如果程序包含违反任何可诊断规则的情况,则符合要求的实施方案应至少发出一条诊断消息."*如果仍然不够,请使用`/ WX`标志,你会得到错误. (2认同)