从 C++11 开始,要将一些 vector y
附加到另一个 vector 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()
还有一些值(value)吗?
最佳答案
是的。类模板参数推导的动机之一是避免必须编写这些类型的工厂函数。对于move_iterator
,CTAD 完全包含了工厂函数。它不仅为您提供所有相同的行为,而且实际上做得更好 - 如果您传入的迭代器已经是一个 move_iterator
,CTAD 不会提供你双重包装而工厂功能会。
但是,仍然会有很多使用工厂函数的代码……所以删除它会是一个破坏性的改变。但它只是过时了,它的继续存在不会对任何人造成伤害。它最终可能会被弃用。
请注意,虽然在这种情况下 CTAD 包含工厂功能是正确的,但在一般情况下情况并非如此,因为这两个选项可能具有不同的功能。它甚至不适用于所有迭代器适配器。对于 std::reverse_iterator(r)
,如果 r
已经是一个 reverse_iterator
,只会给你一份 r
... 而 std::make_reverse_iterator(r)
将重新反转迭代器(有效地返回一个正向迭代器)。
关于c++ - 自 C++17 的类模板参数推导以来,std::make_move_iterator 是否多余?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57762121/