operator->() 是否保证可用于标准 C++ 容器的迭代器?

时间:2021-05-04 17:10:43

标签: c++ iterator standards language-design

#include <map>

int main()
{
    auto coll = std::map<int, int>{{1, 2}};
    auto pos  = coll.begin();

    (*pos).first;   // OK. Conforming to the C++ standard.
    pos->first;     // Does this conform to the C++ standard too?
}

根据cppref,迭代器对象pos必须保证*pos++pos是有效的表达式。但是,C++ 标准不要求 pos->first 也必须是有效的表达式。

是否 operator->() 保证可用于标准 C++ 容器的迭代器?

2 个答案:

答案 0 :(得分:2)

InputIterator 的 C++17 命名迭代器要求,因此所有派生,确实要求迭代器提供 operator->。但是,C++20 迭代器概念没有。特定的实现可能会提供它们,标准库容器遵循 C++17 要求和 C++20 概念的规则。

因此,如果您的模板函数针对 C++20 迭代器/范围概念约束自身,则不允许使用 ->。当然,如果您使用的是非模板代码并且您知道所提供的类型,则可以使用可用的完整界面。

请注意,C++17 的OutputIterator 要求包括->。因此,任何纯输出迭代器(例如,ostream_iterator)的标准库迭代器不一定提供它。

答案 1 :(得分:1)

如果标准说 iterator_traits::pointer 和 iterator_traits::reference 是非空类型,那么标准保证迭代器必须有一个操作符->

<块引用>

23.3.2.3 迭代器特征 [iterator.traits] 1 只用迭代器来实现算法,有时需要确定迭代器 对应于特定迭代器类型的类别。因此,要求如果 I 是一个 迭代器,类型 iterator_traits::iterator_category 被定义为迭代器的迭代器类别。此外,类型 iterator_traits::pointer iterator_traits::reference 应定义为迭代器的指针和引用类型;也就是说,对于类的迭代器对象 a type,分别与 decltype(a.operator->()) 和 decltype(*a) 的类型相同。类型迭代器_- 对于不支持 operator-> 的类类型 I 的迭代器, traits::pointer 应为 void。 此外,对于输出迭代器,类型

相关问题