簡體   English   中英

僅移動輸入和輸出迭代器

[英]move-only input and output iterators

關於InputIterator / OutputIterator -s 將它們的語義修改為僅移動是否一致? 當然,我指的只是新創建的自定義迭代器,而不是STL迭代器。

對輸入和輸出迭代器的++i++r表達式的語義要求的注釋相應說:

后置條件: i的先前值的任何副本不再需要可取消引用或位於==的域中。

在此操作之后, r不需要是可增加的,並且r的先前值的任何副本不再需要是可取消引用或可增加的。

我認為在大多數情況下禁止擁有輸入/輸出迭代器副本的可能性更安全,但從未聽過這樣的建議。 這是個壞主意嗎?

在 C++20 中,新的迭代器概念input_iteratoroutput_iterator不需要可復制。 ranges命名空間中的算法以及視圖適配器也僅支持移動迭代器。

新視圖ranges::istream_view返回僅移動迭代器以提高安全性。 最后,新的 C++20 view概念本身不需要可復制性,它只允許移動自己的狀態。

仍然可以創建不可copyable copyable input_iteratoroutput_iterator ,但我建議不output_iterator

當然, forward_iterator仍然需要是可copyable 哨兵也需要可copyable

您可以在以下論文中閱讀有關該設計的內容

Input/OutputIterator 必須首先滿足 Iterator 要求。 這個要求說,從 C++14,[iterator.iterators],p2:

如果滿足以下條件,則類型X滿足Iterator要求:

  • X滿足CopyConstructibleCopyAssignableDestructible要求 (17.6.3.1)

所以不,他們不能只移動。

這可能不是一個好主意。 迭代器對象通常被設計為輕量級的,並通過值傳遞以提高效率。 並且許多 C++ 標准庫容器使用按值傳遞的迭代器。 禁用復制構造函數對我來說似乎根本不是一個好主意。

例如,參見http://www.cplusplus.com/reference/vector/vector/vector/向量構造函數按值接受輸入迭代器。

並參閱http://www.cplusplus.com/reference/algorithm/copy/以獲取按值接受輸出迭代器的 C++ 標准庫容器示例

暫無
暫無

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

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