地图插入期间的 C++ 移动保证

C++ move guarantees during map insertion

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

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

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

您问错了问题:std::move 什么都不做,因此函数参数未按指定顺序求值并不重要。

重要的是 foo1.id() 在调用 emplace 之前被调用,它从 std::move 提供的 foo1 的引用移动。就是这种情况 - 函数调用总是在对其参数求值之后进行排序。

只要 id() returns 一个值,而不是对可能被移动破坏或无效的东西的引用,此代码就是安全的。