std :: map <> :: insert przy użyciu obiektów nie do skopiowania i jednolita inicjalizacja
Spójrz na następujący kod:
#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
}
Kompilacja tego fragmentu kończy się niepowodzeniem podczas odkomentowania zaznaczonej linii na g ++ 4.7. Wywołany błąd wskazuje na tonon_copyable
nie można go skopiować, ale spodziewałem się, że zostanie przeniesiony.
Dlaczego wstawianie astd::pair
skonstruowane przy użyciu jednolitej inicjalizacji nie powiodło się, ale nie skonstruowane przy użyciustd::make_pair
? Czy obydwa mają tworzyć wartości, które można z powodzeniem przenieść na mapę?