我已经意识到,根据[reverse.iter.opref]中的C ++ - 14标准,reserver_iterator<Iterator>::operator->
必须等同于:
return std::addressof(operator*());
在C ++ 11中(link to same section)是:
return &(operator*());
在C ++ 11中添加了 std::addressof
,所以,它可以在这里使用。我认为这可能只是一个后来纠正的缺陷。
然而,GLIBCXX的反向迭代器(版本6.2.0的gcc)的实现遵循了前C ++ 14的定义:
// /usr/include/c++/6.2.0/bits/stl_iterator.h:174
{ return &(operator*()); }
在该句子中使用operator&
允许代理迭代器在operator&
类型上重载reference
,以便在需要时为迭代器提供正确的语义。所以,也许gcc不会假设reference
将成为前向迭代器案例的真正参考,作为标准的命令。
gcc是否明确允许代理迭代器(它们通常可以工作)?其他编译器是否做同样的事情?
答案 0 :(得分:0)