1

我已经意识到,根据 [reverse.iter.opref]中的 C++-14 标准,reserver_iterator<Iterator>::operator->必须等同于:

return std::addressof(operator*());

而在 C++11 中(链接到同一部分)是:

return &(operator*());

std::addressof是在 C++11 中添加的,所以可以在这里使用。我认为这可能只是后来纠正的缺陷。

但是,GLIBCXX 的反向迭代器(gcc 版本 6.2.0)的实现遵循 C++14 之前的定义:

// /usr/include/c++/6.2.0/bits/stl_iterator.h:174
{ return &(operator*()); }

在该句子中的使用operator&允许代理迭代器operator&reference类型上重载,以便在需要时为其迭代器提供正确的语义。所以,也许 gcc 并没有假设这reference将是前向迭代器案例的真正参考,因为标准要求。

gcc 是否明确允许代理迭代器(毕竟它们通常可以工作)?其他编译器做同样的事情吗?

4

1 回答 1

0

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

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

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

于 2017-04-12T17:37:40.600 回答