g++编译器对字符串数组和整数数组的看法不同吗?

Does the g++ compiler view arrays of strings and integers differently?

本文关键字:数组 看法 整数 编译器 字符串 g++      更新时间:2023-10-16

我似乎无法获得函数内部声明的字符串数组。

void foo(string arr[], int arrSize) {
    string temp[arrSize]; //Results in error shown below
    int temp2[arrSize]; // Compiles fine
}

我得到一个编译时错误,指出:非pod元素类型的可变长度数组'string'(又名'basic_string, allocator>')…[a…

我试过将arrSize参数声明为void foo(string arr[], const int arrSize);的常量,甚至在函数内部声明一个新的常量整数,并将其初始化为arrSize,但两者仍然会导致相同的错误。我能够编译这个的唯一方法是在声明我的临时字符串数组时使用一个幻数。

同时,我知道我可以使用一个向量来代替,但是我只是想知道为什么会发生这种行为。

提前感谢您的帮助!

是的,它以不同的方式对待它们。从错误消息中可以看到,只有当元素是POD类型时,g++才允许创建可变长度数组。

至于为什么我不确定是否有技术上的原因,但由于这是一个从C继承来的非标准扩展,一个可能的解释是,为C兼容结构实现它是微不足道的(这就是POD本质上是什么),没有人费心将其扩展到非POD类型。

对评论的回应:std::string不仅仅是一个字符数组,而是一个更复杂的类,可以在堆的某个地方分配数据(就像std::vector<int>不仅仅是一个整数数组)。

更新:论文中一个有趣的数据点,建议为c++提供具有自动存储持续时间的运行时大小的数组:

没有理由将该特性限制为PODs作为数组元素类型,因此不建议这样的限制。

所以这似乎真的是一种情况:"没有人来真正实现它"