拥有多个 const 限定符是否合法?

Yks*_*nen 19 c++ language-lawyer

由于对 的放置进行了一些讨论const,我开始怀疑是否可以const对同一类型有多个限定符:

#include <iostream>

int main()
{
    const const int a = 5;
    std::cout << a;
}
Run Code Online (Sandbox Code Playgroud)

别担心,我不会写这样的代码

结果,clang 和 MSVC 接受了带有警告的代码,但 GCC 拒绝了它:https : //godbolt.org/z/TdYnvc

哪个编译器是对的?

son*_*yao 15

我认为这是格式错误的。[dcl.type]/2

作为一般规则,至多一个限定型说明符被允许在完整DECL说明符-SEQ一个的声明或在 限定型说明符-SEQ,和至多一个类型说明符被允许在一个类型-说明符序列。此规则的唯一例外情况如下:

  • const 可以与除自身以外的任何类型说明符结合使用。
  • ...

所以不允许constconst const int a = 5;. (由 typedef 引入的 PS 冗余 cv 限定是允许的,将被忽略)。


eer*_*ika 12

拥有多个 const 限定符是否合法?

const const int a = 5;
Run Code Online (Sandbox Code Playgroud)

不。这条规则已经被其他好答案另一个.

请注意,这仅适用于语法,而不适用于一般的类型系统。您可以将 const 应用于 const 类型别名:

using T = const int;
const T a = 5; // OK
Run Code Online (Sandbox Code Playgroud)

多个 cv 限定符以这种方式“折叠”为一个。

哪个编译器是对的?

在“哪个编译器符合标准”的意义上:所有这些。

编译器要求拒绝病态的节目,也不是必须接受他们。由于所有编译器都会发出诊断消息,因此它们都符合标准。引用:

[intro.compliance.general]

尽管本文档仅说明了对 C++ 实现的要求,但如果将这些要求表述为对程序、程序的一部分或程序执行的要求,则通常更容易理解。此类要求具有以下含义:

  • 如果程序不包含违反 [lex] 到 [thread] 和 [depr] 中的规则,则符合要求的实现应在 [implimits] 中描述的资源限制内,接受并正确执行5该程序。
  • 如果程序包含违反任何可诊断规则或在实现不支持该构造时出现本文档中描述为“有条件支持”的构造,则符合的实现应发出至少一个诊断消息
  • 如果程序包含违反不需要诊断的规则,则本文档不要求与该程序相关的实现。

5)“正确执行”可以包括未定义的行为

故意接受格式错误的程序称为“语言扩展”。


Bat*_*eba 8

海湾合作委员会是正确的。

编译器不应该编译代码。原因很明确[dcl.type.cv]/1

有两个cv 限定符constvolatile。每个cv-qualifiercv-qualifier-seq中最多出现一次。

允许添加const到一个已经const输入(模板编程将是困难的,如果这是不可能的)。但是你不能const const按照上面的规则写。