C++数组大小声明和常量
C++ array size declaration and const
我只是从C 跳到C++
在C(89/90)中,const
实际上不是常数(与#define
'd、enum
或文字相反),而是设置后只读的。I.e,我可以:
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++,还是具有C99兼容性的C++扩展。例如:
std::default_random_engine e{};
std::uniform_int_distribution<int> d{};
const int x{d(e)};
int arr[x]; // compiles
我不知道这是否是有效的C++。显然,x
的值直到运行时才知道。我想我可能不明白C和C++const
之间的区别?
您是正确的VLA是C99功能(在C11中是可选的),C++标准不包括此功能,尽管gcc
和clang
都允许它们在C++中作为扩展。我们可以从C++11标准草案8.3.4
数组中看到它们是不允许的,其中写道:
D1 [ constant-expressionopt] attribute-specifier-seqopt
^^^^^^^^^^^^^^^^^^^^^^
对于gcc
和clang
,当您使用扩展时,使用-pedantic
标志将发出警告。如果您的目标是C++11,那么您还应该使用-std=c++11
指定它。您可以使用-pedantic-errors
将警告转换为错误。如果您使用-pedantic
编译代码,您应该看到以下警告:
warning: ISO C++ forbids variable length array 'arr' [-Wvla]
int arr[x]; // compiles
^
gcc
记录了他们对各种标准、默认值和标志的支持,以在GCC支持的语言标准页面上执行标准,并显示:
要获得标准所需的所有诊断,您应该还要指定-pedantic(如果希望的话,也可以指定-pedntic错误错误而不是警告)。
一般来说,clang
支持gcc
的功能,但您可以在其"语言兼容性"页面上找到更多详细信息。
GingerPlusPlus std:vector被认为是C++中VLA的替代方案。
- 是否可以同时声明一个类成员的常量/非常量?
- 在声明中合并两个常量"std::set"(不是在运行时)
- C++:具有内部链接的正向声明常量
- 为什么不能用常量表达式声明数组?
- 无法在声明时使用初始值设定项列表初始化常量字符*/字符串数组的向量
- 关于静态常量数据模因的声明和定义的混淆
- public:静态常量字符串声明/初始化问题
- 为什么MSVC14允许声明指向动态未初始化常量对象的指针
- 有没有办法声明一个公共静态常量,该常量将使用 constexpr 在源文件中定义(有什么区别)?
- C++ 多态性:如果派生类中的虚函数在基类中声明了常量,是否需要将其声明为常量
- C++ 声明常量变量,但推迟其初始化?
- 使用常量变量作为维度将矩阵声明为类成员时出现编译器错误
- 静态常量声明,变量的constexpr定义,有效的c ++?
- 非整数常量声明 - dev-error:在此范围内未声明"type"
- 如何使用 z3 c++ API 将常量声明为非重复常量
- 用常量字符串和字符串常量声明字符串有什么区别
- Cuda:将设备常量声明为模板
- 使用符号常量声明数组时出现问题
- 常量声明-语言差异
- 对于c++中大量的私有类常量声明,任何不从另一个文件#include的理由