C++数组大小声明和const

zac*_*zac 7 c c++ arrays const c++11

我刚刚从C进入C++

在C(89/90)中,a const实际上不是常量(与#define'd enum,或文字相对),而是一旦设置为只读.即,我可以:

const int x = rand();
Run Code Online (Sandbox Code Playgroud)

这很好 - x直到运行时才知道这一点.因此,我不能

int arr[x]; // error - x is not a compile-time constant
Run Code Online (Sandbox Code Playgroud)

然后,C标准之一(99?)继续进行并允许可变长度数组.虽然我通常使用C语言中的ANSI标准编码,但实际上这已经产生了影响,因为我正在尝试拾取C++ 11.

据我所知,C++不允许使用可变长度数组.但是,许多编译器允许它作为扩展(GCC?).问题是,现在我想学习C++ 11,如果有什么我编码为有效的C我不能告诉++或C++扩展与C99兼容.例如:

std::default_random_engine e{};
std::uniform_int_distribution<int> d{};
const int x{d(e)};
int arr[x]; // compiles
Run Code Online (Sandbox Code Playgroud)

我不知道这是否是有效的C++.显然,x直到运行时才知道值.我想我可能不明白C和C++之间的区别const

Sha*_*our 9

你是正确的VLAS是C99功能(在C11可选)和C++标准不包含这个功能虽然两者gccclang允许他们在C++作为扩展.我们可以看到他们不允许进入草案C++ 11标准部分8.3.4 Arrays,它说:

D1 [ constant-expressionopt] attribute-specifier-seqopt
     ^^^^^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

对于两者而言gcc,clang使用该-pedantic标志将在您使用扩展时发出警告.如果您的目标是C++ 11,那么您还应该指定使用-std=c++11.您可以使用-pedantic-errors将警告变为错误.如果您使用编译代码-pedantic,则应看到以下警告:

warning: ISO C++ forbids variable length array 'arr' [-Wvla]
int arr[x]; // compiles
         ^
Run Code Online (Sandbox Code Playgroud)

gcc记录他们对各种标准,默认值和标志的支持,以强制执行GCC页面支持语言标准标准,并说:

要获得标准所需的所有诊断,您还应指定-pedantic(或-pedantic-errors,如果您希望它们是错误而不是警告).

通常clang支持什么gcc,但您可以在其语言兼容性页面上找到更多详细信息.

请注意,如GingerPlusPlus std所述:vector被认为是C++中VLA的替代品.