簡體   English   中英

當 std::move_iterator 取消引用右值引用時,為什么它可以將自己宣傳為前向(或更強)迭代器?

[英]Why can std::move_iterator advertise itself as a forward (or stronger) iterator, when it dereferences to an rvalue reference?

根據 cppreference, std::move_iterator將其::iterator_category設置為其底層迭代器1的類別。

但我認為它充其量只能是一個輸入/輸出迭代器,因為對於前向迭代器reference必須是一個左值引用,而move_iteratorreference (以及operator*的返回類型)設置為一個右值引用2

這是一個錯誤類別的迭代器的公然錯誤標記嗎?

能夠為我自己的迭代器做到這一點無疑是很方便的。 如果即使標准庫也這樣做,我有什么理由不這樣做嗎?


1但是任何比random_access_iterator_tag更強的東西都會被截斷為random_access_iterator_tag ,這很奇怪,因為contiguous_iterator_tag只應該用於::iterator_concept

2或者如果它不是引用,則保持不變,但是底層迭代器也不應該將自己宣傳為前向迭代器。

關於前向迭代器要求的 Cppreference 文章是錯誤的(已由某人修復)。 reference必須是任何引用( &&& ),而不是具體的左值引用( & )。 含義move_iterator確實符合。

請參閱[forward.iterators]/1.3

如果X是可變迭代器,則reference是對T的引用; 如果X是常量迭代器,則reference是對const T的引用

另請參閱LWG1211 (從 2009 年開始),它提出了同樣的問題,並由N3066 (2010 年)解決,它將措辭從“左值引用”更改為“任何引用”。 (感謝@康桓瑋的鏈接)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM