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

C++ 核心常量表达式和数组索引,c++,constant-expression,C++,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 ^ 这似乎与上面链接

参考是指以下代码段:

当我使用(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
            ^
这似乎与上面链接中概述的要求相矛盾,即核心常量表达式不得计算左值->右值隐式转换,除非值:

具有整型或枚举类型,并引用完整的非易失性 常量对象,该对象使用常量表达式初始化


欣赏您的想法。

支持可变长度数组是一种编译器扩展,只要它不会使一致性代码表现出不同的行为,并且只要他们说它是一种扩展(GCC使用该警告):

一致性实现可能具有扩展(包括附加的库函数),前提是它们不会改变任何格式良好的程序的行为。根据本文档,需要实现来诊断使用这种格式错误的扩展的程序。 然而,这样做之后,他们就可以编译和执行这样的程序了

如果需要,可以通过<代码> -学究错误禁用所有扩展。

GCC对允许的C++语言有一个扩展。它当然是非标准的,不可移植的,所以在您自己的代码中避免使用它,以便于使用。
 warning: variable length arrays are a C99 feature
      [-Wvla-extension]
    int tab2[sz]; // error: sz is not a constant expression
            ^