我有一个代码片段,看起来有点像这样:
std::unordered_map<FooId, Foo> fooMap;
Foo foo1(..);
fooMap.emplace(foo1.id(), std::move(foo1));
安心是否安全,即C ++语言标准是否保证在foo1.id()
之前调用std::move(foo1)
?
答案 0 :(得分:7)
您提出错误的问题:std::move
什么都不做,所以函数参数不按指定的顺序进行评估并不重要。
重要的是foo1.id()
在调用emplace
之前调用,foo1
从std::move
提供的引用转移到id()
。情况就是这样 - 在评估参数后,函数调用总是被排序。
只要{{1}}返回一个值,此代码就是安全的,而不是对移动可能被销毁或无效的内容的引用。