[英]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.