在 C++ 中,为什么我不能声明这样的数组:int array[vector.size()]?

0 c++ arrays vector variable-length-array

我想在C++ 20中将浮点向量转换为浮点数组。我在网上搜索并找到了这个解决方案:

#include <iostream>
#include <algorithm>
#include <vector>
 
int main()
{
    std::vector<int> input({ 1, 2, 3, 4, 5 });
 
    int arr[input.size()];
    std::copy(input.begin(), input.end(), arr);
 
    for (int i: arr) {
        std::cout << i << ' ';
    }
 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试实现它时,编译器给出一个错误,指出数组声明中括号内的内容必须是常量表达式。

从什么时候开始出现这种情况了?我发誓我以前在 C++ 中以类似的方式声明过数组并且它有效。如果您在网上查看,您会发现每个人也这样做,我发布的示例似乎是我的问题的标准解决方案。那么为什么它会给我一个错误呢?

Nel*_*eal 9

从什么时候开始出现这种情况了?

一直以来。在标准 C++ 中,如果您在编译时不知道内存块的大小,则无法在堆栈上分配内存块。

一些编译器允许它作为扩展。这在 C99 中也是标准的,这些数组被称为变长数组。

您在网上看到的很多内容都是不标准的。仅仅因为某人做了一些对他们有用的事情并不意味着它也会对你有用。在这种情况下,如果您不关心编写跨平台、符合标准的代码,那么它肯定适合您。但如果你想编写符合标准的代码,你基本上有两种选择:创建一个足够大的数组,在编译时已知,并且只使用其中的一部分,或者不使用数组。

针对您的评论:

因为第三方函数(OpenGL)需要一个数组作为参数。

没有函数需要数组作为参数。它可能需要原始内存块,但您还需要为其提供该块的大小。您可以std::vector使用方法data()和轻松地通过 a 来完成此操作size()。

我知道需要数组作为参数的唯一方法是通过一些模板魔法:

template<std::size_t N>
void print_size(int (&array)[N]) {
    std::cout << N;
}
Run Code Online (Sandbox Code Playgroud)

演示

即使如此,如果您指定大小,您显然可以向它传递一个向量(可能是未定义的行为):

std::vector<int> v = {1, 2, 3};
print_size<3>(reinterpret_cast<int(&)[3]>(*v.data()));
Run Code Online (Sandbox Code Playgroud)