核心常量表达式和数组索引

时间:2018-05-21 01:01:37

标签: c++ constant-expression

引用的是以下代码段:

the code is here

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

初始化

欣赏你的想法。

1 个答案:

答案 0 :(得分:1)

支持可变长度数组是一个编译器扩展,标准通常允许,只要它不会使符合代码的行为不同,并且只要它们它&#39 ;是一个扩展(GCC对此警告做了):

  

符合要求的实现可能具有扩展(包括其他库函数),前提是它们不会改变任何格式良好的程序的行为。根据本文档,需要实现来诊断使用此类扩展的程序。   但是,这样做之后,他们就可以编译和执行这些程序。

[intro.compliance]/8

如果需要,您可以通过-pedantic-errors停用所有扩展程序。