《C++ Primer》中说明,数组中元素的个数也属于数组类型的一部分,编译的时候维度应该是已知的,维度必须是一个表达式。
unsigned cnt = 42; // 不是常量表达式
constexpr unsigned sz = 42;
int arr[10]; // 正确,含有10个int类型数据
int *parr[sz]; // 正确,含有42个int类型指针
string bad[cnt]; // 错误:cnt不是常量表达式
string strs[get_size()]; // 当get_size时constexpr时正确;否则错误
gcc可以支持VLA(variable length array),是因为这是C99标准的一部分,这个特性是g++编译器的扩展。
C++并不支持该特性,在MSVC终会报错,如果申请的内存数组过大,则会导致栈内存溢出。
error C2131: 表达式的计算结果不是常数note: 因读取超过生命周期的变量而失败
程序中不建议使用。使用vector或者在堆上动态申请内存。