将重物插入 std::map

Inserting heavy objects into std::map

这段代码中 VeryHeavy(args...) 精确复制了多少次?

map.emplace(std::pair<VeryHeavyKey, VeryHeavy>(key, VeryHeavy(args...)));

或者,也许,使用 std::make_pair 更好? 复制对象是否有任何标准化的保证? std::map不复制的正确插入重物的方法是什么?

What's the right way to insert heavy object into std::map without copying?

C++17 之前

map.emplace(std::piecewise_construct,
              std::forward_as_tuple(std::move(key)),
              std::forward_as_tuple(args...));

post C++17

map.try_emplace(std::move(key), args...);

C++17 变体改进了前者,如果 key 已经存在,则不构造 VeryHeavy