我的C++标准草案的副本(标记为“ISO / IEC JTC1 SC22 WG21 N3690
日期:2013-05-15“)对于basic_string::c_str()
和basic_string::data()
具有以下定义。
然后,下面的C++程序似乎超出了c_str()
的要求,因此具有未定义的行为:
#include <string>
int main() {
std::string foo = "foo";
foo.c_str();
foo[2] = 'p';
}
这似乎是愚蠢的。我是否误读了标准,或者对
c_str
的要求是过去时代的遗物? 最佳答案
特定的措词是C++ 03年代规范中的遗物,它允许写入时复制字符串。在some point in the past上,c_str()
的规范如下:
在这种情况下,该要求更为合理。如果c_str()
返回指向不同std::string
之间共享的字符串的指针,那么修改数组中的值将是非常糟糕的。
在C++ 14中,此禁止意义不大。正如您所指出的那样,将其读取为禁止在c_str()
调用之后完全禁止修改字符串的做法,这没有多大意义。将其读取为禁止通过返回的指针修改string
会更有意义,但意义不大。没有真正的理由为什么c_str()
返回的指针和使用&operator[](0)
获得的指针之间的语义应该有所不同。
关于c++ - c_str()的要求是否使修改非法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28391138/