繁体   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