Are end+1 iterators for std::string allowed?(是否允许 std::string 的 end+1 迭代器?)
本文介绍了是否允许 std::string 的 end+1 迭代器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
为 这个问题仅限于 C++11 及更高版本,因为在 C++11 之前,数据已经存储在一个连续块中 std::string 创建 end(str)+1 的迭代器是否有效?
如果不是,为什么不是?
我认为这可能会有所不同.std::string 与我推测的任何其他标准容器之间的显着区别在于,它总是包含比其 size 多一个元素,即零终止符,满足.c_str()的要求.21.4.7.1 basic_string 访问器[string.accessors]
const charT* c_str() const noexcept;const charT* data() const noexcept;1 返回:一个指针 p 使得 p + i == &operator[](i) 对于 i 中的每个 i代码>[0,size()].
2 复杂性:恒定时间.
3 要求:程序不得更改字符数组中存储的任何值.
尽管如此,即使它应该恕我直言,保证所述表达式是有效的,为了与零终止字符串的一致性和互操作性,如果没有别的,我发现的唯一一段对此表示怀疑:
<块引用>21.4.1 basic_string 一般要求[string.require]
4 basic_string 对象中的类字符对象应连续存储.也就是说,对于任何 basic_string 对象 s,标识 &*(s.begin() + n) == &*s.begin()+ n 应适用于 n 的所有值,使得 0 <= n <s.size().
(所有引用均来自 C++14 最终草案 (n3936).)
相关:合法覆盖std::string的空终止符?
解决方案
TL;DR: s.end() + 1 是未定义的行为.
std::string 是个奇怪的野兽,主要是历史原因:
- 它试图带来 C 兼容性,其中已知存在一个额外的