是否允许修改c++ 11中操作符[]返回的内部std::string缓冲区?
Is it permitted to modify the internal std::string buffer returned by operator[] in C++11
标准中是否存在违反operator[]
返回的内部std::string
缓冲区修改的规则:
void foo(char* buf)
{
buf[1] = 's';
}
std::string str = "str";
modify_buffer(&str[0]);
我在c++ 11草案中发现了以下关于data
和c_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]
的别名。
相关文章:
- 为什么向量内部的指针在从函数返回时会发生变化?
- 返回给定 SEXP 的子集,而无需知道实际的内部数据类型
- 从内部使用静态 std::string 的函数返回 const char * 是否安全?
- 返回自身内部的双重嵌套类的成员函数,该类继承自从自身继承的类
- 当我返回内部时,循环在C 中不起作用
- 在函数内部错误定位后,从函数中释放返回的指针会导致芯片崩溃
- 使用 c++ 从另一个内部菜单返回到主菜单
- 使用动态铸件来返回派生类内部的变量的不同值
- Linux x64堆栈在信号处理程序内部展开,以修改返回地址
- c++运算符=工作异常(函数内部输出正常,但返回后错误)
- 当在函数内部使用静态变量时,输出会发生变化,该函数在c++中返回引用
- 返回一个在函数内部填充的constchar*向量是定义良好的行为吗
- 从函数内部推断函数返回类型
- 从 lambda 内部返回 C++11 中的 lambda 类型(平面映射函数)
- 内部异常处理程序,MessageBox()成功返回IDOK,但从未显示
- (C++)返回函数内部声明的对象的地址
- 在返回值的函数中使用内部循环返回
- 如何从"this"对象本身内部将shared_ptr返回到当前对象
- 如何从模板类返回内部结构
- 返回内部循环以C++中断循环