C++ 命名要求: LegacyIterator
LegacyIterator 要求描述了可用于识别和遍历容器元素的类型。
LegacyIterator 是其他迭代器类型使用的基本要求集:LegacyInputIterator、LegacyOutputIterator、LegacyForwardIterator、LegacyBidirectionalIterator 和 LegacyRandomAccessIterator。迭代器可以被认为是指针的抽象。
所有迭代器类别都只要求那些在给定类别中能在常数时间(摊还)内实现的功能。因此,迭代器的要求表和概念定义 (自 C++20 起)不指定复杂度。
要求
类型 It 满足 LegacyIterator,如果:
- 类型 It 满足 CopyConstructible,并且
- 类型 It 满足 CopyAssignable,并且
- 类型 It 满足 Destructible,并且
- 类型 It 的左值满足 Swappable,并且
std::iterator_traits<It>
具有成员 typedef,value_type (直到 C++20)、difference_type、reference、pointer 和 iterator_category,并且
给定
r
是类型 It 的左值,以下表达式必须有效并具有其指定效果
表达式 | 返回类型 | 前置条件 |
---|---|---|
*r | 未指定 | r 是可解引用的 |
++r | It& | r 是可递增的(表达式 ++r 的行为已定义) |
概念 (自 C++20 起)
点击展开
对于 std::iterator_traits 的定义,定义了以下仅用于说明的概念。
template<class I>
concept __LegacyIterator =
requires(I i)
{
{ *i } -> __Referenceable;
{ ++i } -> std::same_as<I&>;
{ *i++ } -> __Referenceable;
} && std::copyable<I>;
其中,仅当 T&
是有效类型(特别是 T
不能为 void)时,仅为说明目的而存在的概念 __Referenceable<T>
才被满足。
缺陷报告
以下改变行为的缺陷报告已追溯应用于先前发布的 C++ 标准。
缺陷报告 | 应用于 | 发布时的行为 | 正确行为 |
---|---|---|---|
LWG 3420 | C++20 | 仅为说明目的而存在的概念首先检查可复制性 | 只有当 requires-expression 返回 true 时才检查可复制性 |