是否允许 std::string 的 end+1 迭代器? [英] Are end+1 iterators for std::string allowed?
本文介绍了是否允许 std::string 的 end+1 迭代器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
为 std::string
创建 end(str)+1
的迭代器是否有效?
如果不是,为什么不是?
这个问题仅限于 C++11 及更高版本,因为在 C++11 之前,数据已经存储在一个连续块中 以这种方式存储.
我认为这可能会有所不同.
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).)
解决方案
TL;DR: s.end() + 1
是未定义的行为.
std::string
是个奇怪的野兽,主要是历史原因:
- 它试图带来 C 兼容性,其中已知存在一个额外的