C++ 核心常量表达式和数组索引
参考是指以下代码段: 当我使用(gcc 4.2)编译上述代码段时: g++-ggdb-pedantic-std=c++14-Wall 对于代码中突出显示为错误的行,仅生成以下警告: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 ^ 这似乎与上面链接
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
^