我的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/

10-13 03:58