将重物插入 std::map

Gor*_*dem 2 c++ performance containers stdmap c++-standard-library

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

map.emplace(std::pair<VeryHeavyKey, VeryHeavy>(key, VeryHeavy(args...)));
Run Code Online (Sandbox Code Playgroud)

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

Cal*_*eth 5

在不复制的情况下将重物插入 std::map 的正确方法是什么?

在 C++17 之前

map.emplace(std::piecewise_construct,
              std::forward_as_tuple(std::move(key)),
              std::forward_as_tuple(args...));
Run Code Online (Sandbox Code Playgroud)

C++17 后

map.try_emplace(std::move(key), args...);
Run Code Online (Sandbox Code Playgroud)

C++17 变体通过不构造已经存在的VeryHeavyifkey来改进前者。