程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了拥有多个 const 限定符是否合法?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决拥有多个 const 限定符是否合法??

开发过程中遇到拥有多个 const 限定符是否合法?的问题如何解决?下面主要结合日常开发的经验,给出你关于拥有多个 const 限定符是否合法?的解决方法建议,希望对你解决拥有多个 const 限定符是否合法?有所启发或帮助;

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

#include <iostream>

int main()
{
    const const int a = 5;
    std::cout << a;
}

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

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

哪个编译器是正确的?

解决方法

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

作为一般规则,最多允许一个 defining-type-specifier decl-specifier-seq 的完整 declaration 或在 defining-type-specifier-seq,最多允许一个 type-specifiertype-specifier-seq 中。此规则的唯一例外是 以下:

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

所以不允许像 const 一样重复 const const int a = 5;。 (允许由 typedef 引入的 PS 冗余 cv 限定,将被忽略)。

,

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

const const int a = 5;

没有。该规则已被其他罚款 answer 和 another 涵盖。

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

using T = const int;
const T a = 5; // OK

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

哪个编译器是正确的?

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

编译器不需要拒绝格式错误的程序,也不需要他们接受它们。由于所有编译器都会发出诊断消息,因此它们都符合标准。引用:

[intro.compliance.general]

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

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

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

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

,

GCC 是正确的。

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

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

可以const 添加到已经存在的 const 类型(如果不可能,模板编程会很困难)。但是您不能按照上述规则编写 const const

大佬总结

以上是大佬教程为你收集整理的拥有多个 const 限定符是否合法?全部内容,希望文章能够帮你解决拥有多个 const 限定符是否合法?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。