为什么 libstdc++ 为迭代器上的二元运算符实现 <L,R> 和 <LR> 重载?

问题描述

libstdc++3 中,在头文件 bits/stl_iterator.h(GCC 10 源代码 here)中,{{1} 的每个二元运算符} 定义了两个重载(例如 __normal_iterator):

==

在这种情况下, template<typename _IteratorL,typename _IteratorR,typename _Container> _GLIBCXX20_CONSTEXPR inline bool operator==(const __normal_iterator<_IteratorL,_Container>& __lhs,const __normal_iterator<_IteratorR,_Container>& __rhs) _GLIBCXX_NOEXCEPT { return __lhs.base() == __rhs.base(); } template<typename _Iterator,typename _Container> _GLIBCXX20_CONSTEXPR inline bool operator==(const __normal_iterator<_Iterator,const __normal_iterator<_Iterator,_Container>& __rhs) _GLIBCXX_NOEXCEPT { return __lhs.base() == __rhs.base(); } 返回一个指向数组元素的指针。这也是在整个库中为其他迭代器类型完成的。根据散布在各处的评论和变更日志,这样做是为了支持 .base()iterator 之间的互操作性。

我的问题是,为什么为所有这些都定义了 const_iterator<_IteratorL,_IteratorR,_Container> 重载?也就是说,为什么需要 <_Iterator,_Container>?前者不会涵盖所有情况吗?如果删除后者会破坏什么?

GCC 的 libstdc++ 实现有很多街头信誉,所以我确定有一个很好的,可能是微妙的原因,但我无法弄清楚它可能是什么。

我之所以这么问是因为我目前正在解决我自己的自定义迭代器实现中的一些问题,并将 STL 视为一个模型。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)