Have a look at the following code:
#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
}
Compiling this snippet fails when uncommenting the marked line on g++ 4.7. The error produced indicates that non_copyable
can't be copied, but I expected it to be moved.
Why does inserting a std::pair
constructed using uniform initialization fail but not one constructed using std::make_pair
? Aren't both supposed to produce rvalues which can be successfully moved into the map?
initializer_list<>
created here?std::pair<int, non_copyable>
does not seem to have a constructor that takes one. I thought the uniform initialization syntax would just pick the regular constructor ofpair<>
. – Trescott