首先从标准中摘录一些:
规格string::operator[]():
const_reference运算符[](size_type pos)const;
reference operator [](size_type pos);
需要:pos <= size().
返回:*(begin()+ pos)如果pos <size(),否则引用类型为T的对象,其值为charT(); 参考值不得修改.
复杂性:恒定时间.
规格string::c_str()和string::data():
const charT*c_str()const noexcept;
const charT*data()const noexcept;
返回:指针p,p + i == &operator[](i)对于[0,size()]中的每个i.
复杂性:恒定时间.
通过组合这两个规范,我们可以看到/ p返回的指针必须满足指定字符串的元素,并且等于,指定具有该值的对象.由于指针上的加法运算符用于获取字符串元素和最后一个对象的地址,因此它们必须位于单个数组中(您不能只使用字符串元素并在运行中创建对象,把它返还).那么可以肯定地说,在C++ 11中,保证在其底层存储中具有终止空字符吗?c_str()data()p[0...size()-1]p[size()]operator[](size())charT()charT()charT()str::string
编辑:我没有注意到我的问题的道歉是重复的.但是,我在这里得到的答案似乎与那个重复问题的答案相矛盾.
此外,我应该削弱我的假设:底层表示std::string应该保留足够的空间来保存终止空字符,并自由设置charT()值直到c_str()/ data()被调用.(即底层存储必须能够随时保留至少size()+1元素.)
那么可以肯定地说,在 C++11 中,
std::string可以保证在其底层存储中保留终止空字符吗?
我不明白你如何从这两句话中得出这个结论。特别是,我在这些引号中没有看到任何需要底层实现在您调用c_str()ordata()之前维护终止空字符的内容。
| 归档时间: |
|
| 查看次数: |
576 次 |
| 最近记录: |