为什么 std::move_iterator 在取消对右值引用的引用时可以将自己宣传为前向(或更强)迭代器?
Why can std::move_iterator advertise itself as a forward (or stronger) iterator, when it dereferences to an rvalue reference?
根据 cpp 首选项,std::move_iterator
将其::iterator_category
设置为其底层迭代器1的类别。
但我认为它充其量只能是一个输入/输出迭代器,因为对于前向迭代器reference
必须是左值引用,而move_iterator
reference
(以及返回类型operator*
)设置为右值引用2。
这是对迭代器具有错误类别的公然错误标记吗?
能够为我自己的迭代器执行此操作无疑是方便的。如果即使是标准库也这样做,我有什么理由不应该这样做吗?
1但是任何比random_access_iterator_tag
强的东西都会被截断为random_access_iterator_tag
,这很奇怪,因为contiguous_iterator_tag
应该只用于::iterator_concept
。
2或者,如果它不是引用,则保持原样,但底层迭代器也不应该将自己宣传为前向迭代器。
一方面,关于前向迭代器需求的 cpp偏好文章是错误的(已经被某人修复了)。reference
必须是任何引用(&
或&&
),而不是特定的左值引用(&
)。意思是move_iterator
确实符合。
但另一方面,自动确定::iterator_category
使用不同的措辞,这只允许左值引用:
concept cpp17-forward-iterator = ... && is_lvalue_reference_v<iter_reference_t<I>>
这看起来像一个标准缺陷。我已经写信给lwgchair@gmail.com
,等待回复。
前向迭代器能够使用任何类型的引用的来源:
[forward.iterators]/1.3
:
如果
。X
是一个可变迭代器,reference
是对T
的引用;如果X
是一个常量迭代器,reference
是对const T
的引用
另见LWG1211(从2009年开始),它提出了同样的问题,并由N3066(2010年)解决,它将措辞从"左值参考"更改为"任何参考"。(感谢@康桓瑋的链接)。
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- 没有为自己的结构调用列表推回方法
- c++r值引用应用于函数指针
- 理解c++中的引用
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 类模板,在定义中引用其自己的类型
- "Field has incomplete type"引用自己的类的问题
- 如何解决对自己的C++成员函数的未定义引用?
- 对自己库函数的未定义引用
- 为什么我的指针在 main 中取消引用后具有不同的值,而不是在我自己的自定义函数中取消引用它时?
- OpenCV 未定义引用我自己的库中的方法
- 使用自己的库使用 cmake 的未定义引用
- 用指针和引用混淆自己,c++(从WinAPI获取鼠标坐标)
- 使用我自己的迭代方法的未定义引用