Hol*_*Cat 7 c++ language-lawyer
根据 cppreference,std::move_iterator将其设置为其基础迭代器1::iterator_category的类别。
但我认为它最多可以是一个输入/输出迭代器,因为对于前向迭代器 reference来说必须是左值引用,而move_iterator设置reference(以及 的返回类型operator*)为右值引用2。
这是迭代器公然错误地标记了错误的类别吗?
能够为我自己的迭代器执行此操作无疑很方便。如果标准库也这样做的话,我有什么理由不应该这样做吗?
1但是任何比 强的东西random_access_iterator_tag都会被截断为random_access_iterator_tag,这很奇怪,因为contiguous_iterator_tag它只应该用于::iterator_concept。
2或者,如果它不是引用,则保持不变,但底层迭代器也不应该将自己宣传为前向迭代器。
一方面,关于前向迭代器要求的cppreference 文章是错误的(已被某人修复)。reference必须是任何引用 (&或&&),而不是特定的左值引用 ( &)。意义move_iterator确实相符。
但另一方面,自动确定::iterator_category 使用不同的措辞,只允许左值引用:
\n\nRun Code Online (Sandbox Code Playgroud)\nconcept cpp17-forward-iterator = ... && is_lvalue_reference_v<iter_reference_t<I>>\n
这看起来像是一个标准缺陷(最终由 LWG 3798修复)。
\n能够使用任何类型引用的前向迭代器的来源:
\n\n\n\nif
\nX是一个可变迭代器,reference是对 的引用T;ifX是一个常量迭代器,reference是对const T
另请参见LWG1211 (2009 年起),它提出了相同的问题,并由N3066 (2010 年)解决,N3066 将措辞从“左值引用”更改为“任何引用”。(感谢@\xe5\xba\xb7\xe6\xa1\x93\xe7\x91\x8b 的链接)。
\n