在地图插入过程中C ++移动保证

时间:2015-03-26 02:18:53

标签: c++ c++11 move-semantics unordered-map

我有一个代码片段,看起来有点像这样:

std::unordered_map<FooId, Foo> fooMap;
Foo foo1(..);
fooMap.emplace(foo1.id(), std::move(foo1));

安心是否安全,即C ++语言标准是否保证在foo1.id()之前调用std::move(foo1)

1 个答案:

答案 0 :(得分:7)

您提出错误的问题:std::move什么都不做,所以函数参数不按指定的顺序进行评估并不重要。

重要的是foo1.id()在调用emplace之前调用,foo1std::move提供的引用转移到id()。情况就是这样 - 在评估参数后,函数调用总是被排序。

只要{{1}}返回一个值,此代码就是安全的,而不是对移动可能被销毁或无效的内容的引用。