'constexpr'功能奇怪的行为?

'constexpr' function strange behavior?

本文关键字:constexpr 功能      更新时间:2023-10-16

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

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;
}

似乎数组被定义为未知大小,因为"a"和"b"都有未知值?

活生生的例子。

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

要获得警告,请使用 -pedantic 。要获取错误,请使用 -pedantic-errors(或更一般的-Werror (。对于此特定扩展,-Wvla将为g++-Wvla-extension clang++执行此操作。

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

叮当当++:

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

G++:

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