'constexpr'功能奇怪的行为?

时间:2014-12-21 16:06:10

标签: c++ c++14 constexpr

有人可以解释一下这是如何编译的吗?

constexpr int Add(int a, int b)
{
    return a + b;
}

int main()
{
    int a, b; //Both left Uninitialized as locals

    char arr[Add(a, b)];

    cout << sizeof(arr) << endl;
}

似乎数组定义为未知大小,因为它们都是&#39; a&#39;和&#39; b&#39;有未知价值?

直播example

1 个答案:

答案 0 :(得分:4)

您展示的在线编译器使用-std=gnu++1y作为标准,并且不使用-pedantic。这并没有禁用某些扩展,特别是GCC和clang支持作为扩展的C99可变长度数组(VLA)。

要获得警告,请使用-pedantic。要收到错误,请使用-pedantic-errors(或更一般的-Werror)。对于此特定扩展程序,-Wvla将针对g++-Wvla-extensionclang++执行此操作。

也更喜欢-std=c++1y而不是GNU变种来避免扩展。

铛++:

warning: variable length arrays are a C99 feature [-Wvla-extension]

克++:

warning: ISO C++ forbids variable length array 'a' [-Wvla]