代码之家  ›  专栏  ›  技术社区  ›  user9196120

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

  •  1
  • user9196120  · 技术社区  · 7 年前

    参考如下代码段:

    Core constant expressions

    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
    }
    

    当我使用(GCC4.2)编译上述代码段时:

    G++GGDB -学究式-STD= C++ 14 - Wall

    对于代码中突出显示为错误的行,仅生成以下警告:

     warning: variable length arrays are a C99 feature
          [-Wvla-extension]
        int tab2[sz]; // error: sz is not a constant expression
                ^
    

    这似乎与上面链接中概述的要求相矛盾,即核心常量表达式不能计算lvalue->rvalue隐式转换,除非值:

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

    感谢你的想法。

    1 回复  |  直到 7 年前
        1
  •  1
  •   hlt    7 年前

    支持可变长度数组的是一个编译器扩展,标准通常允许只要不使一致的代码行为不同,只要它们 它是一个扩展(GCC对该警告做了这样的处理):

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

    [intro.compliance]/8

    如果需要,您可以通过 -pedantic-errors .