【问题标题】:error C3863: array type 'double [length]' is not assignable错误 C3863:数组类型 'double [length]' 不可分配
【发布时间】: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&lt;double&gt;std::vector&lt;double&gt; 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


【解决方案1】:

double a[length]; 不是可移植的 C++,因为该语言没有实现可变长度数组。

std::vector<double> a(bar.size());

是替代品。请注意,元素将为您初始化为零,因此您可以删除初始化循环。

【讨论】:

    猜你喜欢
    • 2022-08-20
    • 2016-04-16
    • 2012-11-04
    • 2016-06-17
    • 2020-07-22
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多