如何解决operator->() 是否保证可用于标准 C++ 容器的迭代器?
#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++ 容器的迭代器?
解决方法
InputIterator 的 C++17 命名迭代器要求,因此所有派生,确实要求迭代器提供 operator->
。但是,C++20 迭代器概念没有。特定的实现可能会提供它们,标准库容器遵循 C++17 要求和 C++20 概念的规则。
因此,如果您的模板函数针对 C++20 迭代器/范围概念约束自身,则不允许使用 ->
。当然,如果您使用的是非模板代码并且您知道所提供的类型,则可以使用可用的完整界面。
请注意,C++17 的OutputIterator 要求不包括->
。因此,任何纯输出迭代器(例如,ostream_iterator
)的标准库迭代器不一定提供它。
如果标准说 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。 此外,对于输出迭代器,类型
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。