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?
你是正确的VLAS是C99功能(在C11可选)和C++标准不包含这个功能虽然两者gcc并clang允许他们在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的替代品.