为什么data()和c_str()返回char const*,而operator []返回char&?

rig*_*old 5 c++ string const

为什么std::string::datastd::string::c_str()返回指针const的字符,而std::string::operator[]返回引用可变字符?

std::string string("eightfold is the greatest");

auto s = string.data();
*s = 'r'; // illegal

auto t = &string[0];
*t = 'r'; // totally fine

auto& c = string[0];
c = 'r'; // totally fine
Run Code Online (Sandbox Code Playgroud)

为什么不std::string::data()std::string::c_str()返回char*,或者为什么不std::string::operator[]char const&

这背后的理由是什么?

AnT*_*AnT 14

operator []使您可以直接访问受控std::string对象序列.c_str()原来没有.

在原始规范中std::string,存储序列不需要是以零结尾的字符串.这意味着通常情况下c_str()无法返回指向存储序列的直接指针.它必须返回一个指针,该指针指向一个完全独立的,单独分配的受控序列的临时副本(添加了零终止符).出于这个原因,尝试修改返回的C字符串c_str()完全没有意义.应用于该单独C字符串的任何修改都不会传播到实际受控序列.(事实上​​,规范明确禁止任何修改尝试.例如,对于空std::string的实现可以简单地返回指向字符串文字的指针"",当然是不可修改的,并且可以在所有std::string对象之间轻松共享.)因此,制作完全有意义c_str()返回const char *.

C++ 11更改了内部规范,c_str()使其返回指向实际受控序列的直接指针.但外部规格c_str()保持不变,以使其与传统规范保持一致.