为什么这个 const const const 声明是有效的?

19

一位朋友让我解释为什么

const const const const const int const i = 0;

这是有效的语法。我拒绝对此发表任何看法。虽然我很好奇它是否只是一个语法问题?

编辑。标签是C++,我的朋友参考的是gcc,所以我可能应该添加C标签。


4
不是。 - Konrad Rudolph
3
@Konrad. 这是有效的C代码,但无效的C++代码。(并非有意删除) - Guilherme Bernal
1
@GuilhermeBernal 在这种情况下,我的评论仍然适用:该问题被标记为 [tag:c++]。由于这些是不同的语言,不应混淆,我不确定您的评论添加了什么内容。现在 OP 已经添加了 [tag:c] 标签,情况发生了变化。 - Konrad Rudolph
1
我对所讨论的编程语言感到困惑。然而,我本来期望它能够适用于C和C++两种语言。尽管这个出色的答案证明了相反的情况。 - Captain Giraffe
1
有趣的是,即使在非C++11模式下(实际上允许这样做),g++也会为双重const生成错误,但它不会以任何方式抱怨constexpr const(当然并不完全相同,但仍然在某种程度上是多余的)。 - Damon
显示剩余4条评论
1个回答

28

从n1256:

6.7.3/4

如果在同一个specifier-qualifier-list中直接或通过一个或多个typedefs多次出现相同的限定符,其行为与仅出现一次时相同。

在C++中,这应该会报错。

从C++03标准:

7.1.5/1 [dcl.type]

通常情况下,在声明的完整decl-specifier-seq中只允许最多一个类型指定符。但以下是唯一的例外:

— const或volatile可以与任何其他类型指定符组合使用。 然而,除非通过typedefs(7.1.3)或模板类型参数(14.3)引入,否则禁止冗余的cv限定符,在这种情况下,忽略冗余的cv限定符。

从N3797 (C++11):

7.1.6/2 [dcl.type]

通常情况下,在声明的完整decl-specifier-seq或type-specifier-seq或trailing-type-specifier-seq中只允许最多一个类型指定符。但以下是唯一的例外:

— const can be combined with any type specifier except itself.

& 一样,我相信。typedef int& t; typedef t& u; 将意味着 ut 是相同的类型。(但要注意字面上的 &&,那是 c++11) - Aaron McDaid

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