Ich habe mir die neuen Funktionen von C ++ 11 angeschaut und eine davon verwirrt mich, weil ich keine Möglichkeit finde, sie in Real World zu verwenden.
Es ist gelöschte und defaulted Funktionen, hat jemand reale Beispiele seiner Verwendung oder ist es nur eine dieser Funktionen, die nur etwas Zucker hinzufügt?
Nehmen wir an, unser Standardkonstruktor macht nichts Spezielles und ist (mehr oder weniger) gleich dem vom Compiler erzeugten Konstruktor. Wir können es reparieren, indem wir entweder unseren eigenen Standardkonstruktor schreiben (was mühsam werden kann, wenn unsere Klasse viele nicht-statische Mitglieder hat) oder indem wir die = default
-Syntax verwenden:
Das Löschen von Funktionen ist nützlich, wenn wir die Verwendung bestimmter Überladungen oder Vorlagenspezialisierungen verbieten oder nur das Kopieren (oder Verschieben) von Objekten verbieten möchten.
%Vor%Wenn Sie das Kopieren (d. h. Thread-Objekte) verbieten möchten, besteht die übliche idiomatische Methode darin, einen privaten Kopierkonstruktor ohne Implementierung zu deklarieren (yeah oder boost :: noncopyable). Während dies in den meisten Fällen funktioniert, können Sie manchmal in einige obskure Linker-Fehler geraten. Überlegen Sie:
%Vor% Indem A(const A&)
gelöscht wird, vermeiden wir mögliche Linker-Fehler und machen unsere Absicht (Kopieren verbieten) sehr klar.
Eine vom Benutzer deklarierte spezielle Member-Funktion ist nicht trivial. Wenn eine Klasse nichttriviale spezielle Elementfunktionen hat, ist die Klasse nicht POD. Daher ist dieser Typ POD:
%Vor%aber dieser Typ ist kein POD:
%Vor%Sie würden die gelöschten Funktionen für Klassen verwenden, in denen Sie beispielsweise das Kopieren oder die direkte Instanziierung verhindern möchten (eine einzelne Stelle, an der Sie stattdessen eine Funktion get_instance () ausführen möchten). Sie können auch löschen verwenden, um bestimmte Variationen Ihres Konstruktors zu verhindern.
Der Standardwert ist nützlich, wenn der vom Compiler generierte Konstruktor für einen der implizit generierten Konstruktoren verwendet werden soll. Wenn Sie beispielsweise einen benutzerdefinierten Argumentkonstruktor erstellen, wird das Standard-Argument "nein" vom Compiler nicht generiert. Sie können also fragen, ob es mit dem Standardschlüsselwort für Sie generiert wird.
Sehen Sie hier Beispiele für die oben genannten