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