可变长度数组也是 Clang 中的扩展吗?

Arb*_*est 6 c++11

我知道 VLA 不是 C++11 的一部分,我已经看到 GCC 的这个失误。这是我转向 Clang 的部分原因。但现在我也看到了 Clang。我正在使用 clang 3.2(落后于最新版本)并且我正在使用-pedantic 和 -std=c++11 进行编译

我希望我的测试不会编译但它编译和运行。

int myArray[ func_returning_random_int_definitely_not_constexpr( ) ];
Run Code Online (Sandbox Code Playgroud)

这是编译器错误还是我遗漏了什么?

回应这里的评论是 random_int_function()

#include <random>
int random_int_function(int i) 
{
    std::default_random_engine generator;
    std::uniform_int_distribution<int> distribution(1,100);

    int random_int = distribution(generator);  

    return i + random_int;
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*han 5

是的,与 C++11 标准(第 8.3.4/1 节)相反,clang 3.2/3.3 支持可变长度数组。

正如你所说,一个程序,例如:

#include <random>

int random_int_function(int i) 
{
    std::default_random_engine generator;
    std::uniform_int_distribution<int> distribution(1,100);

    int random_int = distribution(generator);  

    return i + random_int;
}

int main() {
    int myArray[ random_int_function( 0 ) ];
    (void)myArray;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译并运行。但是,根据-pedantic; -std=c++11您所说的选项,clang 3.2/3,3 诊断:

警告:可变长度数组是 C99 特性 [-Wvla]

该行为与 gcc (4.7.2/4.8.1) 的行为相匹配,后者更强调警告:

警告:ISO C++ 禁止可变长度数组“myArray”[-Wvla]

要使诊断成为错误,对于任一编译器,请传递-Werror=vla.

  • `-pedantic-errors` 可能更有助于使其成为错误:它使所有由 `-pedantic` 触发的错误成为错误,而不仅仅是 VLA。 (4认同)