在C中允许重复的常量限定符,但在C++中不允许
Duplicate const qualifier allowed in C but not in C++?
示例代码片段
const const const int x = 10;
int main()
{}
可以用C编译,但不能用C++编译。为什么它是用C编译的?我以为这在C中也会失败。没关系。
C++标准的哪一部分禁止使用重复的const
,C标准的哪部分允许这样做?
C99§6.7.3/4:
如果同一限定符在同一说明符限定符列表中多次出现,无论是直接出现还是通过一个或多个typedef出现,其行为与仅出现一次相同。
是的,这是有效的C99,您的发现是正确的。
从上一个C++0x草稿,[dcl.type]:
作为一般规则,在声明的完整decl说明符seq中,或在类型说明符seq或尾部类型说明符seq中,最多允许有一个类型说明符。该规则的唯一例外情况如下:
--const可以与除其本身之外的任何类型说明符组合。
--volatile可以与除其本身之外的任何类型说明符组合。
--带符号或无符号可以与char、long、short或int组合。
--short或long可以与int.组合使用
--long可以与double组合。
--long可以与long组合。
C++2003在7.1.5/1中禁止它"…禁止冗余的cv限定符,除非通过使用typedefs或模板类型参数引入…"。
C++0x语法似乎允许它:
cv限定符seq:
- cv限定符 cv限定词seqopt
cv限定符:
const volatile
此外,[decl.type.cv]
似乎允许它:
有两个cv限定符,
const
和volatile
。如果cv限定符出现在decl说明符seq中,则声明的init声明符列表不应为空。[注:3.9.3和8.3.5描述了简历质量的影响对象和函数类型。--结束语]多余的简历资格被忽略。[注:例如可以由typedefs引入。——尾注]
相关文章:
- 代码在main()中运行,但在函数中出现错误
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- 换位表导致测试失败(但在游戏中运行良好)
- 库标题在标题中不可见,但在 cmake build 下.cpp文件中完全可见.为什么?
- 树莓上的 Libtorch 无法加载 pt 文件,但在 ubuntu 上工作
- 在成员dynamic_bitset上使用 boost::from_block_range 时出错,但在本地dynamic
- 编译在我的 Mac 上工作,但在集群 (Linux) 上不起作用
- 我编写了代码将十进制分数转换为其二进制等效数.它编译得很好,但在执行时挂起
- 我的代码运行良好,但在游戏循环中中断
- C++ assigment std::list:<typename>:itrator 在 main 中工作,但在方法中它不起作用
- C++代码在台式机上工作正常,但在笔记本电脑上则不行
- 实现 DFS 在较短的输入下工作正常,但在较大的输入下会抛出分段错误
- 点云库在VS 2019中不起作用,但在VS 2017中确实有效
- C++ Python 模块在 Blender 中崩溃,但在 Python 控制台中不会崩溃
- 分段 Linux Ubuntu 中的 g++ 错误,但在 Windows 中的 g++/MingW 中,在 C++ 中打
- 为什么数组大小信息可用于"sizeof"运算符和 delete[] 运算符,但在将数组作为参数传递到
- 如何处理没有默认构造函数但在另一个构造函数中构造的对象?