Hum*_*awi 7 c++ dictionary move c++11
之间有什么区别:
std::map <int,std::pair<T,T>> m;
T t1,t2;
m.emplace(1,std::make_pair(t1,t2));
Run Code Online (Sandbox Code Playgroud)
和:
std::map <int,std::pair<T,T>> m;
T t1,t2;
m.emplace(1,std::move(std::make_pair(t1,t2)));
Run Code Online (Sandbox Code Playgroud)
是std::move多余的吗?请问std::map::emplace并直接perfect forwarding分配std::pair在std::map?
Pio*_*cki 13
std::make_pair(...)并且std::move(std::make_pair(...))都是rvalue表达式(第一个是prvalue,第二个是xvalue).由于emplace转发引用,两者都被推断为相同的类型,因此std::move在这种情况下是多余的,但在一般情况下,冗余std::move可以禁止复制省略.
m.emplace(1, std::make_pair(t1, t2));
Run Code Online (Sandbox Code Playgroud)
相当于:
auto&& arg = std::make_pair(t1, t2);
std::pair<const int, std::pair<T, T>> e(1, std::forward<std::pair<T, T>>(arg));
Run Code Online (Sandbox Code Playgroud)
它执行map元素值的以下初始化:
auto&& arg = std::make_pair(t1, t2);
std::pair<T, T> p(std::forward<std::pair<T, T>>(arg));
Run Code Online (Sandbox Code Playgroud)
请注意,这与以下内容不同:
std::pair<T, T> p(t1, t2);
Run Code Online (Sandbox Code Playgroud)
前者首先创建一个prvalue对(使副本t1和t2),然后将其从(移动两个复制的移动t1和t2进入p).不会发生任何复制.
后者使用t1并t2初始化T存储在该对中的两个s.
为了避免第一种语法产生不必要的移动,您可以改为使用分段构造:
m.emplace(std::piecewise_construct
, std::forward_as_tuple(1)
, std::forward_as_tuple(t1, t2));
Run Code Online (Sandbox Code Playgroud)
这相当于:
auto&& arg = std::tuple<T&, T&>(t1, t2);
std::pair<T, T> p(std::get<0>(std::forward<std::tuple<T&, T&>>(arg))
, std::get<1>(std::forward<std::tuple<T&, T&>>(arg)));
Run Code Online (Sandbox Code Playgroud)
这将从绑定到原始t1和t2.的引用成员初始化该对的元素.
| 归档时间: |
|
| 查看次数: |
2701 次 |
| 最近记录: |