C ++数组大小声明和const

我只是跳进C ++,来自C

在C(89/90)中, const实际上不是常量(与# #defineenum或literal相反),而是一旦设置为只读。 即,我可以:

 const int x = rand(); 

这很好 – 直到运行时才知道x的点。 因此,我不能

 int arr[x]; // error - x is not a compile-time constant 

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

据我所知,C ++不允许使用可变长度数组。 但是,许多编译器允许它作为扩展(GCC?)。 问题是,现在我正在尝试学习C ++ 11,我无法判断我编写的是有效的C ++,还是C ++扩展的C99兼容性。 例如:

 std::default_random_engine e{}; std::uniform_int_distribution d{}; const int x{d(e)}; int arr[x]; // compiles 

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

您是正确的VLA是C99function ( 在C11中可选的 ),并且C ++标准不包括此function,尽管gccclang允许它们在C ++中作为扩展。 我们可以看到他们不被允许进入C ++ 11标准草案 8.3.4 arrays说:

 D1 [ constant-expressionopt] attribute-specifier-seqopt ^^^^^^^^^^^^^^^^^^^^^^ 

对于使用-pedantic标志的gccclang ,当您使用扩展时会发出警告。 如果您的目标是C ++ 11,那么您还应该使用-std=c++11指定。 您可以使用-pedantic-errors将警告转换为错误。 如果使用-pedantic编译代码, -pedantic应该看到以下警告:

 warning: ISO C++ forbids variable length array 'arr' [-Wvla] int arr[x]; // compiles ^ 

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

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

一般来说, clang支持gccfunction,但您可以在语言兼容性页面上找到更多详细信息。

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