c++ - 核心常量表达式和数组索引
问题描述
参考以下代码段:
int main() {
const std::size_t tabsize = 50;
int tab[tabsize]; // OK: tabsize is a constant expression
std::size_t n = 50;
const std::size_t sz = n;
int tab2[sz]; // error: sz is not a constant expression
// because sz is not initialized with a constant expression
}
当我使用(gcc 4.2)编译上面的代码段时:
g++ -ggdb -pedantic -std=c++14 -Wall
对于代码中突出显示为错误的行,仅生成以下警告:
warning: variable length arrays are a C99 feature
[-Wvla-extension]
int tab2[sz]; // error: sz is not a constant expression
^
这似乎与上述链接中概述的要求相矛盾,即核心常量表达式不得评估左值->右值隐式转换,除非值:
具有整型或枚举类型,指的是一个完整的非易失性 const 对象,该对象用常量表达式初始化
欣赏你的想法。
解决方案
支持可变长度数组是一种编译器扩展,标准通常允许,只要它不会使符合代码的行为有所不同,并且只要他们说它是一个扩展(GCC 会使用该警告):
一个符合规范的实现可以有扩展(包括额外的库函数),只要它们不改变任何格式良好的程序的行为。需要实现来诊断使用根据本文档格式错误的扩展的程序。然而,这样做之后,他们可以编译和执行这样的程序。
如果需要,您可以通过 禁用所有扩展-pedantic-errors
。
推荐阅读
- c++ - 有没有一种简单的方法来检查 C++ 中的不安全表达式?
- vue.js - Vuetify 表不接受输入
- css - Angular Bootstrap 中不存在 pull-right
- chisel - 关于外交(火箭芯片)的惰性评估的问题?
- .net - 如何将 .net 标准 2.0 安装到 Visual Studio 2017 中
- python - PyCharm:找不到火花提交,操作系统:MAC
- r - 通过它们连接的节点的属性计算图中的边
- c++ - Qt 无法加载可可插件
- windows - 聚合由 Windows 进程进行的内存访问集合的更简单方法?
- angular - 在firebase中检索值