c – std :: move with std :: make_pair

前端之家收集整理的这篇文章主要介绍了c – std :: move with std :: make_pair前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
之间有什么区别:
std::map <int,std::pair<T,T>> m;
T t1,t2;
m.emplace(1,std::make_pair(t1,t2));

和:

std::map <int,std::move(std::make_pair(t1,t2)));

这里的std :: move多余了吗?请问std :: map :: emplace和完美转发是否可以直接在std :: map中分配std :: pair?

解决方法

std :: make_pair(…)和std :: move(std :: make_pair(…))都是rvalue表达式(第一个是prvalue,第二个是xvalue).由于emplace采用转发引用,因此两者都被推导为相同的类型,因此在这种情况下std :: move是多余的,但在一般情况下,冗余的std :: move可以禁止copy-elision.
m.emplace(1,t2));

相当于:

auto&& arg = std::make_pair(t1,t2);
std::pair<const int,T>> e(1,std::forward<std::pair<T,T>>(arg));

它执行map元素值的以下初始化:

auto&& arg = std::make_pair(t1,t2);
std::pair<T,T> p(std::forward<std::pair<T,T>>(arg));

请注意,这与以下内容不同:

std::pair<T,T> p(t1,t2);

前者首先创建一个prvalue对(制作t1和t2的副本),然后将其移出(将复制的t1和t2移动到p).不会发生任何复制.

后者使用t1和t2来初始化存储在该对中的两个Ts.

为了避免第一种语法产生不必要的移动,您可以改为使用分段构造:

m.emplace(std::piecewise_construct,std::forward_as_tuple(1),std::forward_as_tuple(t1,t2));

这相当于:

auto&& arg = std::tuple<T&,T&>(t1,T> p(std::get<0>(std::forward<std::tuple<T&,T&>>(arg)),std::get<1>(std::forward<std::tuple<T&,T&>>(arg)));

这将从绑定到原始t1和t2的引用成员初始化该对的元素.

原文链接:https://www.f2er.com/c/117267.html

猜你在找的C&C++相关文章