gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:28:55 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com