【发布时间】:2017-09-07 15:07:13
【问题描述】:
我意识到,根据[reverse.iter.opref] 中的C++-14 标准,reserver_iterator<Iterator>::operator-> 必须等同于:
return std::addressof(operator*());
在 C++11 (link to same section) 中是:
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& 允许代理迭代器在reference 类型上重载operator&,以便在需要时为其迭代器提供正确的语义。所以,也许 gcc 并没有假设 reference 将成为前向迭代器案例的真正参考,因为标准要求。
gcc 是否明确允许代理迭代器(毕竟它们通常工作)?其他编译器做同样的事情吗?
【问题讨论】:
-
所以替代方案是 1) GCC 实现了 C++98 规范,但还没有改变它以匹配 C++14 的规范;或 2) GCC“显式”但显然默默地实现了一个无处记录的扩展,这取决于广泛反对重载一元
operator&的做法,并且破坏了符合 C++14 的代码。嗯,我知道我会选哪一个。 -
@T.C.是的,这听起来像是阴谋论,但是,否则,代理迭代器可能会停止工作。不仅仅是添加一个扩展(是的!在代理迭代器的
reference上重载operator&而不为编译器指定额外的选项!),我说也许它保持不变以不破坏旧的诡计。代理迭代器被标准明确禁止,但无论如何都是一个请求的功能(像我一样,我不知道在哪里可以找到以确保我的代理能够工作)。我只是在阅读一些 STL 实现以了解迭代器的确切使用方式,我发现了这一点。
标签: c++ gcc iterator c++14 reverse-iterator