我天真地期望这个程序能够以成功状态编译和运行:
#include <iterator>
#include <string>
int main()
{
const std::string s = "foo";
auto forward_iter = s.begin();
auto reverse_iter = std::make_reverse_iterator(forward_iter);
auto third_iter = std::make_reverse_iterator(reverse_iter);
return forward_iter != third_iter;
}
编译失败,因为类型和我们开始的third_iter
不一样;forward_iter
相反,它是reverse_iterator<reverse_iterator<normal_iterator>>
:
0.cpp:10:25: error: no match for ‘operator!=’ (operand types are ‘__gnu_cxx::__normal_iterator<const char*, std::__cxx11::basic_string<char> >’ and ‘std::reverse_iterator<std::reverse_iterator<__gnu_cxx::__normal_iterator<const char*, std::__cxx11::basic_string<char> > > >’)
return forward_iter != third_iter;
~~~~~~~~~~~~~^~~~~~~~~~~~~
重新阅读文档,它似乎std::make_reverse_iterator(it)
被指定为始终 wrap it
,即使it
已经是一个反向迭代器(在某种程度上这是有道理的,因为我们期望使用reverse_iterator
成员(即base()
)。
在不知道我有哪种类型的情况下,是否有一种标准方法可以在普通(正向)和包装(反向)迭代器之间进行交换?或者我是否需要编写一对 SFINAE 函数来std::make_reverse_iterator(it)
适当地返回it.base()
?