C++ 命名要求: LegacyBidirectionalIterator
LegacyBidirectionalIterator 是一个 LegacyForwardIterator,可以双向移动(即递增和递减)。
如果一个 LegacyBidirectionalIterator it
源自一个 Container,那么 it
的 value_type
与容器的 value_type
相同,因此解引用 (*it
) 获取容器的 value_type
。
要求
如果类型 It 满足 LegacyBidirectionalIterator
- 类型 It 满足 LegacyForwardIterator
并且,给定
a
和b
,类型 It 的左值reference
,由std::iterator_traits<It>::reference
表示的类型
以下表达式必须有效并具有其指定的效果
表达式 | 返回 | 等价表达式 | 备注 |
---|---|---|---|
--a | It& | 前置条件: a 可递减 (存在 b 使得 a == ++b )后置条件: a 可解引用 --(++a) == a 如果 --a == --b 那么 a == b a 和 --a 指向同一个迭代器对象 | |
a-- | 可转换为 const It& | It temp = a; --a; return temp; | |
*a-- | reference |
可变 LegacyBidirectionalIterator 是一个 LegacyBidirectionalIterator,它额外满足 LegacyOutputIterator 要求。
备注
begin 迭代器不可递减,如果计算 --container.begin()
,则行为未定义。
双向迭代器不必可解引用才能递减(特别是,end 迭代器不可解引用但可递减)。
概念 (自 C++20 起)
点击展开
对于 std::iterator_traits 的定义,定义了以下仅用于说明的概念。
template<class I>
concept __LegacyBidirectionalIterator =
__LegacyForwardIterator<I> && requires(I i)
{
{ --i } -> std::same_as<I&>;
{ i-- } -> std::convertible_to<const I&>;
{ *i-- } -> std::same_as<std::iter_reference_t<I>>;
};
其中,仅用于说明的概念 __LegacyIterator
在 LegacyIterator#Concept 中描述。
缺陷报告
以下改变行为的缺陷报告已追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 发布时的行为 | 正确行为 |
---|---|---|---|
LWG 299 (N3066) | C++98 | *a-- 的返回类型要求可转换为 T | 返回类型要求为 reference |
LWG 383 | C++98 | --a 之后 b 要求可解引用 | a 代替要求可解引用 |