我似乎无法在函数内部声明一个字符串数组。
void foo(string arr[], int arrSize) {
string temp[arrSize]; //Results in error shown below
int temp2[arrSize]; // Compiles fine
}
我收到编译时错误,指出:非POD元素类型的可变长度数组' string' (aka' basic_string,allocator>')... [a ...
我尝试使用void foo(string arr[], const int arrSize);
将arrSize参数声明为常量,甚至在函数内部声明一个新的常量整数并将其初始化为arrSize,但两者仍然会导致相同的错误。我能够编译的唯一方法是在声明我的临时字符串数组时使用幻数。
另外,我知道我可以使用向量代替,但我只是想知道为什么会出现这种情况。
提前感谢您的帮助!
答案 0 :(得分:5)
是的,它以不同的方式对待它们。正如您从错误消息中看到的那样,只有当元素是POD类型时,g ++才允许创建可变长度数组。
至于为什么我不确定是否存在技术原因,但由于这是从C继承的非标准扩展,一个可能的解释是,为c兼容实现它是微不足道的结构(这是POD本质上是什么)并且没有人愿意将其扩展到非POD类型。
回应评论:std::string
不仅仅是一个字符数组,而是一个更复杂的类,它可以在堆上的某个地方分配数据(就像std::vector<int>
isn&# 39; t只是一个整数的数组。)
更新:一篇有趣的数据点来自于为c ++提出Runtime-sized arrays with automatic storage duration的论文:
没有理由将功能限制为POD作为数组元素类型,因此没有提出这样的限制。
所以看起来真的是这样一个案例:&#34;没有人来实际实施它&#34;