[英]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_iterator
, move_iterator
將不會給你雙重包裝,而工廠函數會。
但是,仍然會有很多代碼使用工廠函數...因此刪除它將是一個重大變化。 但它只是過時了,它的繼續存在不會對任何人造成傷害。 它最終可能會被棄用。
請注意,雖然在這種情況下CTAD包含工廠函數是正確的,但在一般情況下並非如此,因為這兩個選項可能具有不同的功能。 對於所有迭代器適配器來說都不是這樣。 對於std::reverse_iterator(r)
,如果r
已經是reverse_iterator
,只會給你一個r
...的副本,而std::make_reverse_iterator(r)
將重新反轉迭代器(有效地返回一個前向迭代器) 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.