C++11 的 std::string 的基础表示形式是否保证具有终止空字符?

Is C++11's std::string's underlying representation guaranteed to have the terminating null character in place?

本文关键字:终止 字符 string std 表示 C++11 是否      更新时间:2023-10-16

先从标准中摘录一些内容:

string::operator[]()规格:

const_reference operator[](size_type) const;
引用操作符[](size_type pos);
require : pos <= size().
: *(开始()+ pos)如果pos & lt;Size(),否则是对对象的引用类型为T,值为charT()的对象;参考值不得为修改。
复杂度: constant time.

string::c_str()string::data()规格:

const charT* c_str() const noexcept;const data() const noexcept;
返回:一个指针p,使得p + i == &operator[](i)对应每个i in[0,大小()]。
复杂度: constant time.

结合这两个规范,我们可以看到,c_str()/data()返回的指针p必须满足p[0...size()-1]表示字符串的元素,p[size()]等于operator[](size()),它表示一个值为charT()的对象。由于指针上的加法运算符用于获取字符串元素和最后一个charT()对象的地址,因此它们必须位于单个数组中(您不能只拥有字符串元素并动态创建charT()对象并返回它)。那么,可以肯定地说,在c++ 11中,str::string保证在其底层存储中具有终止null字符吗?


EDIT:对不起,我没有注意到我的问题是重复的。然而,我在这里得到的答案似乎与那个重复问题的答案相冲突。

同样,我应该像这样削弱我的假设:std::string的底层表示应该保留足够的空间来容纳终止null字符,并在c_str()/data()被调用之前自由设置charT()的值。(即底层存储必须能够在任何时候至少容纳size()+1个元素)

不,不是。std::string可以延迟计算c_str()data()所需的结果。在调用这些方法之前,不能保证底层存储中存在空终止符。

标准只保证字符串字符的连续性。

那么可以肯定地说,在c++ 11中,std::string保证在其底层存储中具有终止null字符吗?

我不明白你怎么能从这两句话中得出这个结论。特别是,我在这些引号中没有看到任何需要底层实现维护终止空字符的内容,直到调用c_str()data()

不…可以肯定地说:那个operator[](size()) == CharT()和那个c_str()[size()] == 0和那个data()[size()] == 0

是否"底层存储"有一个0在那里是实现定义的,也应该对你的程序没有影响,因为没有办法访问它,除了通过operator[]c_str(),这是在size()定义的。