Werfen Sie einen Blick auf den folgenden Code:std :: map <> :: insert mit nicht-kopierbaren Objekten und einheitliche Initialisierung
#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
}
diese Schnipsel kompilieren schlägt fehl, wenn die markierte Zeile auf g uncommenting ++ 4.7. Der erzeugte Fehler zeigt an, dass non_copyable
nicht kopiert werden kann, aber ich habe erwartet, dass es verschoben wird.
Warum schlägt das Einfügen einer std::pair
, die mit uniformer Initialisierung erstellt wurde, fehl, aber nicht eine, die mit std::make_pair
erstellt wurde? Sollen nicht beide Rvalues erzeugen, die erfolgreich in die Map verschoben werden können?
Ja, das ist im Grunde, was ich geschrieben habe, bevor ich meine Antwort löschte. Ich habe allerdings einen Zweifel: Warum wird hier eine 'initializer_list <>' erstellt? 'std :: pair' scheint keinen Konstruktor zu haben, der einen übernimmt. Ich dachte, die uniforme Initialisierungssyntax würde nur den regulären Konstruktor von 'pair <>' auswählen. –
Auch initializer_list <> Elemente müssen alle vom selben Typ sein, nein? – eladidan
+1 zu beiden Kommentaren. In meinem Beispiel sollte es nicht einmal eine 'initializer_list' geben. Es ist mehr wie ein Aufruf an 'std :: pair's Konstruktor, der eine einheitliche Initialisierung verwendet. – mfontanini