是否允许修改c++ 11中操作符[]返回的内部std::string缓冲区?

Is it permitted to modify the internal std::string buffer returned by operator[] in C++11

本文关键字:返回 内部 std 缓冲区 string 操作符 许修改 修改 c++ 是否      更新时间:2023-10-16

标准中是否存在违反operator[]返回的内部std::string缓冲区修改的规则:

void foo(char* buf)
{
  buf[1] = 's';
}
std::string str = "str";
modify_buffer(&str[0]);

我在c++ 11草案中发现了以下关于datac_str函数的引用:

要求:程序不能改变存储在字符数组中的任何值。

但是我没有看到任何关于operator[]的信息。

operator[]

operator[]返回对该字符的引用。因此,如果string不是const,您可以安全地修改它。

对于c++ 11,字符是连续存储的,因此可以将&str[0]作为大小为str.size()的底层数组的开头。如果string不是const,则可以修改[ &str[0], &str[0] + str.size() )之间的任何元素。例如,您可以将&str[0]str.size()传递给void func(char *arr, size_t arr_size): func(&str[0], str.size())

data()c_str()成员

对于c++ 11和c++ 14, data()c_str()都返回const CharT*,所以你不能用返回的指针修改元素。然而,从c++ 17开始,如果string不是const, data()将返回CharT*data()将是&str[0]的别名。