【发布时间】:2020-11-10 21:36:22
【问题描述】:
在 windows MSVC 中,我试图编译下面的代码。
void foo(std::vector<double> &bar){
const long int length = bar.size();
double a[length]; //error C3863: array type 'double [length]' is not assignable
for(int i=0; i < length; i++){
a[i]=0.0;
}
//do some other things
}
代码在 xcode 中运行良好。
当我切换到 MSVC 时,用命令行编译代码:
cl /EHsc main.cpp /std:c++17
然后出现“错误 C3863:数组类型 'double [length]' 不可赋值”。
为什么不一样?如何摆脱错误?
【问题讨论】:
-
double a[length];是 VLA(不包括在标准 C++ 中)。将a改为std::vector<double>:std::vector<double> a(bar.size());将执行您现在尝试执行的操作,但使用标准 C++。它还有一个额外的好处,就是您之后也不需要将所有值都设置为0.0。 -
double a[length];不是合法的 C++,XCode 会误导你。数组边界必须是编译时常量,length是一个变量。请改用std::vector。 -
一些 C++ 编译器将 VLA 实现为扩展。 MSVC 不是其中之一。
-
我建议您在从 xcode 编译时添加
-Wall -Wextra -pedantic -pedantic-errors,以免在尝试使用其他编译器编译您的程序时出现这样的意外。
标签: c++ visual-c++ c++17