C 中允许重复的 const 限定符,但 C++ 中不允许?

发布于 2024-11-03 00:24:14 字数 193 浏览 0 评论 0原文

示例代码片段

const const const int x = 10;   
int main()
{}

在 C 中编译,但在 C++ 中不编译。为什么用C编译?我认为这在 C 中也会失败。没关系。

C++ 标准的哪一部分禁止使用重复的 const,而 C 标准的哪一部分允许这样做?

Sample code snippet

const const const int x = 10;   
int main()
{}

gets compiled in C but not in C++. Why does it get compiled in C? I thought this would fail in C as well. Never mind.

Which part of the C++ Standard forbids the use of duplicate const and which part of the C standard allows this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

幸福还没到 2024-11-10 00:24:14

C99 §6.7.3/4:

如果相同的限定符在同一个 specifier-qualifier-list 中直接出现或通过一个或多个 typedef 出现多次,则行为与如果它只出现一次。

是的,这是有效的 C99,并且您的发现是正确的。

C99 §6.7.3/4:

If the same qualifier appears more than once in the same specifier-qualifier-list, either directly or via one or more typedef s, the behavior is the same as if it appeared only once.

Yes, that is valid C99, and your discovery is correct.

抹茶夏天i‖ 2024-11-10 00:24:14

从最新的 C++0x 草案来看,[dcl.type]:

作为一般规则,声明的完整 decl-specifier-seq 或 type-specifier-seq 或 Trailing-type-specifier-seq 中最多允许有一个类型说明符。此规则的唯一例外如下:

——const 可以与除自身之外的任何类型说明符组合。

— 易失性可以与除自身之外的任何类型说明符组合。

— 有符号或无符号可以与 char、long、short 或 int 组合。

—short 或 long 可以与 int 组合。

—long 可以与 double 组合。

—long 可以与 long 组合。

From the last C++0x draft, [dcl.type]:

As a general rule, at most one type-specifier is allowed in the complete decl-specifier-seq of a declaration or in a type-specifier-seq or trailing-type-specifier-seq. The only exceptions to this rule are the following:

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

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

— signed or unsigned can be combined with char, long, short, or int.

— short or long can be combined with int.

— long can be combined with double.

— long can be combined with long.

棒棒糖 2024-11-10 00:24:14

C++ 2003 在 7.1.5/1 中禁止它“...禁止冗余 cv 限定符,除非通过使用 typedef 或模板类型参数引入...”。

C++ 2003 prohibits it in 7.1.5/1 "... redundant cv-qualifiers are prohibited except when introduced through the use of typedefs or template type arguments ...".

轮廓§ 2024-11-10 00:24:14

C++0x 语法似乎允许这样做:

cv-qualifier-seq

  • cv-qualifier cv-qualifier-seq opt

简历限定符

<前><代码>常量

易挥发的


另外,< code>[decl.type.cv] 似乎允许它:

有两个cv 限定符const易失性。如果cv-qualifier出现在decl-specifier-seq中,则声明的init-declarator-list不得为空。 [注:3.9.3 和 8.3.5 描述了 cv 限定符如何影响
对象和函数类型。 — 尾注] 多余的简历资格将被忽略。 [注:例如,这些
可以通过 typedef 引入。 ——尾注]

The C++0x grammar appears to allow it:

cv-qualifier-seq:

  • cv-qualifier cv-qualifier-seq opt

cv-qualifier:

  const

  volatile

Also, [decl.type.cv] appears to allow it:

There are two cv-qualifiers, const and volatile. If a cv-qualifier appears in a decl-specifier-seq, the init-declarator-list of the declaration shall not be empty. [ Note: 3.9.3 and 8.3.5 describe how cv-qualifiers affect
object and function types. — end note ] Redundant cv-qualifications are ignored. [ Note: For example, these
could be introduced by typedefs. — end note ]

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文