我似乎无法获得在函数内部声明的字符串数组。
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/