c++ - g++ 编译器是否以不同方式查看字符串数组和整数数组?

标签 c++ arrays string gcc

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

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

我收到一个编译时错误,指出:非 POD 元素类型“string”的可变长度数组(又名“basic_string,分配器 >”)...[a...

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

此外,我知道我可以只使用 vector 来代替,但我只是想知道为什么会发生这种行为。

在此先感谢您的帮助!

最佳答案

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

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

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

更新:提出 Runtime-sized arrays with automatic storage duration 的论文中的一个有趣数据点对于 C++:

There is no reason to limit the feature to PODs as array element types, thus such a limitation is not proposed.

所以这似乎真的是这样一种情况:“没有人来实际实现它”

关于c++ - g++ 编译器是否以不同方式查看字符串数组和整数数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40469972/

相关文章:

c++ - move 的对象仍然被破坏?

c++ - 错误 : 'object' was not declared in this scope

PHP按字段排序数组?

c# 我如何比较两个具有匹配字母但一个有空格的字符串

c# - 在 C# 中删除二维字符串数组的行

c++ - 将时间戳写入文件

c++ - 分发 DbgHelp.DLL

arrays - 如何保持关联数组顺序?

Javascript 传递字符串来创建对象名称(菜鸟)

java - 使用 split() 数组索引越界后但在循环中读取数组