Gnu的reverse_iterator <iterator> :: operator-&gt;和代理迭代器

时间:2017-04-12 02:39:00

标签: c++ gcc iterator c++14 reverse-iterator

我已经意识到,根据[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是否明确允许代理迭代器(它们通常可以工作)?其他编译器是否做同样的事情?

1 个答案:

答案 0 :(得分:0)

&中使用std::reverse_iterator<Iterator>::operator->被标记为2188中的库缺陷,以及C ++ 14中引入的更改。

但是,这种变化并不令人满意,因为std::reverse_iterator需要双向迭代器,并且它不禁止代理指针(没有迭代器概念禁止它)。虽然前向迭代器'reference必须是真正的引用,但同样不适用于pointer类型:它不需要是pointer值类型,它可以是代理指针。

所以,还有另一个库问题,仍然是开放的,没有就如何解决这个问题达成共识:1052。也许这个问题是因为gcc不会改变operator->的实现(或者他们只是忘了它)。