首页 > 解决方案 > 核心常量表达式和数组索引

问题描述

参考以下代码段:

核心常量表达式

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 对象,该对象用常量表达式初始化

欣赏你的想法。

标签: c++constant-expression

解决方案


支持可变长度数组是一种编译器扩展,标准通常允许,只要它不会使符合代码的行为有所不同,并且只要他们说它是一个扩展(GCC 会使用该警告):

一个符合规范的实现可以有扩展(包括额外的库函数),只要它们不改变任何格式良好的程序的行为。需要实现来诊断使用根据本文档格式错误的扩展的程序。然而,这样做之后,他们可以编译和执行这样的程序。

[intro.compliance]/8

如果需要,您可以通过 禁用所有扩展-pedantic-errors


推荐阅读