地图插入期间的 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 一个值,而不是对可能被移动破坏或无效的东西的引用,此代码就是安全的。
我有一个代码片段,看起来有点像这样:
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 一个值,而不是对可能被移动破坏或无效的东西的引用,此代码就是安全的。