Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Gnu';s反向迭代器<;迭代器>;::操作员->;和代理迭代器_C++_Gcc_Iterator_C++14_Reverse Iterator - Fatal编程技术网

C++ Gnu';s反向迭代器<;迭代器>;::操作员->;和代理迭代器

C++ Gnu';s反向迭代器<;迭代器>;::操作员->;和代理迭代器,c++,gcc,iterator,c++14,reverse-iterator,C++,Gcc,Iterator,C++14,Reverse Iterator,我已经意识到,根据中的C++-14标准,reserver\u迭代器::运算符->必须等效于: return std::addressof(operator*()); 而在C++11()中是: std::addressof是在C++11中添加的,因此可以在这里使用。我想这可能只是一个后来被纠正的缺陷 但是,GLIBCXX对反向迭代器(gcc 6.2.0版)的实现遵循C++14之前的定义: // /usr/include/c++/6.2.0/bits/stl_iterator.h:174 { re

我已经意识到,根据中的C++-14标准,
reserver\u迭代器::运算符->
必须等效于:

return std::addressof(operator*());
而在C++11()中是:

std::addressof
是在C++11中添加的,因此可以在这里使用。我想这可能只是一个后来被纠正的缺陷

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

// /usr/include/c++/6.2.0/bits/stl_iterator.h:174
{ return &(operator*()); }
在该句中使用
操作符&
允许代理迭代器在
引用
类型上重载
操作符&
,以便在需要时为迭代器提供正确的语义。因此,也许gcc并没有像标准要求的那样,假设
引用
将是前向迭代器情况的真正引用


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

std::reverse\u iterator::operator->
中使用
&
在中被标记为库缺陷,并且在C++14中引入了更改

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


所以,还有另一个图书馆问题,仍然没有解决,没有关于如何解决这个问题的共识:。也许正是这个问题使得gcc没有改变
操作符->
的实现(或者他们只是忘记了它)。

std::reverse\u iterator::operator->
中使用
&
在中被标记为库缺陷,并且在C++14中引入了更改

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


所以,还有另一个图书馆问题,仍然没有解决,没有关于如何解决这个问题的共识:。也许正是这个问题使得gcc没有改变
操作符->
(或者他们只是忘记了它)。

因此,备选方案是:1)gcc实现了C++98规范,但没有改变它以匹配C++14的规范;或者2)GCC“显式”但显然是无声地实现了一个扩展,该扩展没有任何文档记录,它依赖于普遍反对的重载一元
运算符&
,并且破坏了符合C++14标准的代码。嗯,我知道我会选哪一个。@T.C.是的,这听起来像合谋,但,否则,代理迭代器可能会停止工作。除了在代理迭代器的
reference
上添加扩展(是的!、重载
操作符&
,而不为编译器指定额外选项!),我要说的是,它可能保持不变,以避免打破旧的诡计。标准明确禁止使用代理迭代器,但无论如何,代理迭代器都是必需的功能(像我一样,我不知道在哪里可以找到代理迭代器,以确保我的代理可以工作)。我刚刚阅读了一些STL实现,以了解迭代器是如何使用的,我发现了这一点。因此,备选方案是:1)GCC实现了C++98规范,但尚未将其更改为符合C++14规范;或者2)GCC“显式”但显然是无声地实现了一个扩展,该扩展没有任何文档记录,它依赖于普遍反对的重载一元
运算符&
,并且破坏了符合C++14标准的代码。嗯,我知道我会选哪一个。@T.C.是的,这听起来像合谋,但,否则,代理迭代器可能会停止工作。除了在代理迭代器的
reference
上添加扩展(是的!、重载
操作符&
,而不为编译器指定额外选项!),我要说的是,它可能保持不变,以避免打破旧的诡计。标准明确禁止使用代理迭代器,但无论如何,代理迭代器都是必需的功能(像我一样,我不知道在哪里可以找到代理迭代器,以确保我的代理可以工作)。我刚刚阅读了一些STL实现来了解迭代器是如何使用的,我发现了这一点。
// /usr/include/c++/6.2.0/bits/stl_iterator.h:174
{ return &(operator*()); }