c++ - 自 C++17 的类模板参数推导以来,std::make_move_iterator 是否多余?

标签 c++ iterator c++17 ctad

从 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/

相关文章:

java - 如何在 Java 中的 JSON 对象中访问此 key ?

C++17 文件系统调用产生段错误

c++ - 从点创建 OOBB

java - 迭代时出现 NoSuchElementException

c++ - 如何使用 std::copy 将一张 map 复制到另一张 map 中?

c++ - 为什么不允许 std::variant 与其替代类型之一进行相等比较?

c++ - 在相邻的查找中使用greater_equal来查找排序序列中的相等元素

c++ - MySQL Connector C/C++ 8.0.13 - 不支持 UNICODE/UTF8?

c++ - 构造函数初始化数组

c++ - Conan + CMake + C++ : Linking against Boost. 记录静态库失败