Ton*_*vel 7 c++ iterator c++17
从C ++ 11开始,要将某些向量追加y到另一个向量x,可以执行以下操作:
x.insert(x.end(), std::make_move_iterator(y.begin()), std::make_move_iterator(y.end()));
Run Code Online (Sandbox Code Playgroud)
使用C ++ 17类模板参数推论,可以更简洁地编写此代码:
x.insert(x.end(), std::move_iterator(y.begin()), std::move_iterator(y.end()));
Run Code Online (Sandbox Code Playgroud)
从C ++ 17开始,这不会变得std::make_move_iterator多余吗?拥有一些有价值的东西std::make_move_iterator()吗?
是。类模板参数推论的动机之一是避免必须编写此类工厂函数。在的情况下move_iterator,CTAD完全包含了出厂功能。它不仅可以为您提供所有相同的行为,而且实际上可以做得更好-如果要传递的迭代器已经是move_iterator,则CTAD不会给您双重包装,而工厂函数却可以。
但是,仍然会有很多使用工厂功能的代码...因此删除它将是一个重大的变化。但是它只是过时的,它的持续存在不会对任何人造成伤害。它可能最终被弃用。
请注意,虽然在这种情况下CTAD包含工厂功能是正确的,但在一般情况下却并非如此,因为这两个选项可能具有不同的功能。并非所有迭代器适配器都适用。对于std::reverse_iterator(r),如果r已经是reverse_iterator,则只会为您提供r... 的副本,而std::make_reverse_iterator(r)将反向反转迭代器(有效地使您返回正向迭代器)。