Zapraszamy do obejrzenia poniższego kodu:std :: map <> :: insert przy użyciu non-copyable obiektów i jednolitej inicjalizacji
#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 ten fragment nie powiedzie się podczas odkomentowanie zaznaczoną linię na g ++ 4.7. Utworzony błąd wskazuje, że non_copyable
nie można skopiować, ale oczekiwałem, że zostanie przeniesiony.
Dlaczego wstawianie std::pair
skonstruowanego przy użyciu jednolitej inicjalizacji kończy się niepowodzeniem, ale nie zostało wykonane przy użyciu std::make_pair
? Czy obie strony nie powinny produkować wartości rublicznych, które można z powodzeniem przenieść na mapę?
Tak, to w zasadzie to, co napisałem przed usunięciem mojej odpowiedzi. Mam jednak wątpliwości: dlaczego utworzono tutaj 'initializer_list <>? 'std :: pair' nie ma konstruktora, który je posiada. Myślałem, że jednolita składnia inicjalizacji wybierze zwykły konstruktor 'pair <>'. –
Również elementy initializer_list <> muszą być tego samego typu, nie? – eladidan
+1 do obu komentarzy. W moim przykładzie nie powinno być nawet 'initializer_list'. To bardziej przypomina wywołanie konstruktora 'std :: pair' przy użyciu jednolitej inicjalizacji. – mfontanini