次のコードを見てください。
#include <utility>
#include <map>
// non-copyable but movable
struct non_copyable {
non_copyable() = default;
non_copyable(non_copyable&&) = default;
non_copyable& operator=(non_copyable&&) = default;
// you shall not copy
non_copyable(const non_copyable&) = delete;
non_copyable& operator=(const non_copyable&) = delete;
};
int main() {
std::map<int, non_copyable> map;
//map.insert({ 1, non_copyable() }); < FAILS
map.insert(std::make_pair(1, non_copyable()));
// ^ same and works
}
g++ 4.7 でマークされた行のコメントを外すと、このスニペットのコンパイルが失敗します。生成されたエラーは、non_copyable
コピーできないことを示していますが、移動されることを期待していました。
std::pair
均一な初期化を使用して構築されたものを挿入すると失敗するのに、を使用して構築されたものを挿入できないのはなぜstd::make_pair
ですか? 両方とも、マップに正常に移動できる右辺値を生成するはずではありませんか?