gpt4 book ai didi

c++ - 我可以取消引用std::string.end()吗?

转载 作者:行者123 更新时间:2023-12-01 12:44:03 24 4
gpt4 key购买 nike

我相信对此的常见回答是“否”,因为容器的end()迭代器表示“过去”地址,这是取消引用的未定义行为。我在标准中找不到明确的语句可以免除此约束中的字符串,即使字符串相对于其他容器有特殊情况也是如此。

C++ 11标准声明您可以读取字符串末尾的一个索引。 string[size()]引用空终止符的只读值。

24.3.2.5 basic_string element access [string.access]

const_reference operator[](size_type pos) const;

reference operator[](size_type pos);

(1) Requires: pos <= size().

(2) Returns: *(begin() + pos) if pos < size(). Otherwise, returns a reference to an object of type charT with value charT(), where modifying the object to any value other than charT() leads to undefined behavior.


front()定义为等效于 return operator[](0),对于空字符串,等效于 return operator[](size())
end() - begin()的定义很明确,它是字符串长度的差值,因此 end()必须指向 size()的索引,这样才能明智地实现该算法。

在上面的标准摘录中,它声明 operator[](pos)*(begin() + pos)等效为 pos < size()。它不是说您可以取消引用 begin() + size(),但是您认为假设此定义正确是否合理?或者更好的是,您是否知道一些免除字符串迭代器约束的证据?

另外,是否可以证明任何 *(begin() + i)ioperator[](i)等效?

最佳答案

根据string.end()的定义:

Returns: An iterator which is the past-the-end value.



并从 past-the-end的定义中:

... Such a value is called a past-the-end value. Values of an iterator i for which the expression *i is defined are called dereferenceable. The library never assumes that past-the-end values are dereferenceable. ...



重点是我的,我想在第一个链接中会提到对 std::string所做的任何异常。由于不是,因此省略 std::string.end()的引用是不确定的。

关于c++ - 我可以取消引用std::string.end()吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61669762/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com