我有一个代码片段,看起来有点像这样:
std::unordered_map<FooId, Foo> fooMap;
Foo foo1(..);
fooMap.emplace(foo1.id(), std::move(foo1));
emplace 是否安全,即 C++ 语言标准是否保证 foo1.id()
在 std::move(foo1)
之前被调用?
最佳答案
您问错了问题:std::move
什么都不做,因此函数参数未按指定顺序求值并不重要。
重要的是 foo1.id()
在调用 emplace
之前被调用,它从对 foo1
的引用 move 标准::move
。就是这种情况 - 函数调用总是在对其参数求值之后进行排序。
只要 id()
返回一个值,而不是对可能被 move 破坏或无效的东西的引用,这段代码就是安全的。
关于 map 插入期间的 C++ move 保证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29270003/