C++ 非常量数组声明的编译错误,C++;

C++ 非常量数组声明的编译错误,C++;,c++,c++11,multidimensional-array,compiler-errors,C++,C++11,Multidimensional Array,Compiler Errors,奇怪,非常奇怪的案子。 考虑代码: int n = 50; auto p1 = new double[n][5]; //OK auto p2 = new double[5][n]; //Error main.cpp:在函数“int main()”中: main.cpp:17:26:错误:新表达式中的数组大小必须为常量 自动p2=新的双精度[5][n]//错误 main.cpp:17:26:错误:“n”的值在常量表达式中不可用 main.cpp:15:8:注意:“int n”不是常量 有人能解释

奇怪,非常奇怪的案子。 考虑代码:

int n = 50;
auto p1 = new double[n][5]; //OK
auto p2 = new double[5][n]; //Error
main.cpp:在函数“int main()”中:
main.cpp:17:26:错误:新表达式中的数组大小必须为常量
自动p2=新的双精度[5][n]//错误

main.cpp:17:26:错误:“n”的值在常量表达式中不可用
main.cpp:15:8:注意:“int n”不是常量


有人能解释为什么第二个出现编译错误,但第一个运行得很好吗?

使用
new double[n][5]
您正在分配
n
类型的
double[5]

使用
新的双[5][n]
您正在分配
5
。而且C++没有VLA,所以无效。< /P> 与以往一样,解决方案是使用:

std::vector p2(5,std::vector(n));
上面将
p2
定义为
double
的向量。它将
p2
构造为具有
5个
元素的大小,其中每个元素初始化为
n
值的向量。

将解释您的问题,附带说明您在
新[]
表达式页面的“解释”部分下给出的确切示例(有趣!?)。见摘录:

如果类型是数组类型,则除第一个维度外的所有维度都必须指定为正整数常量表达式(直到C++14)转换为std::size_t类型的常量表达式(自C++14以来),但第一个维度可以是可转换为std::size_t的任何表达式。这是直接创建在运行时定义大小的数组的唯一方法,此类数组通常称为动态数组

“获取编译错误”,不会发布错误。它可能会帮助您查看。
std::vector<std::vector<double>> p2(5, std::vector<double>(n));