簡體   English   中英

自從C ++ 17的類模板參數推斷以來,std :: make_move_iterator是多余的嗎?

[英]Is std::make_move_iterator redundant since C++17's class template argument deduction?

從C ++ 11開始,要移動一些向量y到另一個向量x ,你可以這樣做:

x.insert(x.end(), std::make_move_iterator(y.begin()), std::make_move_iterator(y.end()));

使用C ++ 17類模板參數推導,可以更簡潔地編寫它:

x.insert(x.end(), std::move_iterator(y.begin()), std::move_iterator(y.end()));

從C ++ 17開始,那會不會使std::make_move_iterator多余? 使用std::make_move_iterator()還有一些價值嗎?

是。 類模板參數推導的動機之一是避免編寫這些類型的工廠函數。 move_iterator的情況下, move_iterator完全包含了工廠函數。 它不僅給你所有相同的行為,而且它實際上做得更好 - 如果你傳入的迭代器已經move_iteratormove_iterator將不會給你雙重包裝,而工廠函數會。

但是,仍然會有很多代碼使用工廠函數...因此刪除它將是一個重大變化。 但它只是過時了,它的繼續存在不會對任何人造成傷害。 它最終可能會被棄用。


請注意,雖然在這種情況下CTAD包含工廠函數是正確的,但在一般情況下並非如此,因為這兩個選項可能具有不同的功能。 對於所有迭代器適配器來說都不是這樣。 對於std::reverse_iterator(r) ,如果r已經是reverse_iterator ,只會給你一個r ...的副本,而std::make_reverse_iterator(r)將重新反轉迭代器(有效地返回一個前向迭代器) 。

暫無
暫無

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

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