map 插入期间的 C++ move 保证

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

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

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/

相关文章:

c++ - 通过值或引用传递 std::string

c++ - 链接 CUDA + 纯 C++ 代码 : undefined reference to `__fatbinwrap_66_tmpxft_ etc

c++ - 如何默认构造迭代器的value_type作为函数中的默认参数?

c++ - FFMPEG Audio解码并绘制波形

c++ - 带有模板函数的 Typedef

C++11 std::atomic_fetch_add 与 __sync_fetch_and_add

c++ - 我可以以 constexpr 方式获取 C++ 类型名称吗?

android - 如何在 Android 上使用 ndk 独立工具链的 libcurl

c++ - C++11 是否保证 return 语句中的局部变量将被 move 而不是复制?

c++ - 可以将 char* move 到 std::string 中吗?