class my_class
{
...
my_class(my_class const &) = delete;
...
};
Was bedeutet = delete
das in diesem Zusammenhang?
Gibt es andere "Modifikatoren" (außer = 0
und = delete
)?
c++
function
c++11
declaration
delete-operator
Pat O'Keefe
quelle
quelle
#define
a la Qt, das mit 0 bewertet und dann eine versteckte Funktion oder so deklariert wurde.Antworten:
Das Löschen einer Funktion ist eine C ++ 11-Funktion :
quelle
=delete
macht die Methode auch in Kontexten unzugänglich, in denenprivate
Methoden angezeigt werden (dh innerhalb der Klasse und ihrer Freunde). Dies beseitigt jegliche Unsicherheit beim Lesen des Codes. @Prasoon, in diesem zweiten Beispiel werden immer noch nur Konstruktoren gelöscht - es wäre schön, wenn beispielsweise ein Konstruktor gelöscht würdeoperator long ()
.= delete
ist besser als die Verwendungprivate
oder andere ähnliche Mechanismen , weil Sie in der Regel wollen die verbotene Funktion sichtbar deklarieren und so für die Überladungsauflösung usw., berücksichtigt wird , dass es so früh wie möglich ausfallen kann und die klarste Fehler für den Benutzer zur Verfügung stellen. Jede Lösung, bei der die Deklaration "ausgeblendet" wird, verringert diesen Effekt.= 0
bedeutet, dass eine Funktion rein virtuell ist und Sie kein Objekt aus dieser Klasse instanziieren können. Sie müssen daraus ableiten und diese Methode implementieren= delete
bedeutet, dass der Compiler diese Konstruktoren nicht für Sie generiert. AFAIK Dies ist nur für den Kopierkonstruktor und den Zuweisungsoperator zulässig. Aber ich bin nicht so gut im kommenden Standard.quelle
=delete
Syntax. Sie können es beispielsweise verwenden, um implizite Konvertierungen, die möglicherweise mit dem Aufruf stattfinden, explizit zu verbieten. Dazu löschen Sie einfach die überladenen Funktionen. Weitere Informationen finden Sie auf der Wikipedia-Seite zu C ++ 0x.= delete
ist nicht ganz korrekt.= delete
kann für jede Funktion verwendet werden. In diesem Fall wird sie explizit als gelöscht markiert und jede Verwendung führt zu einem Compilerfehler. Für spezielle Elementfunktionen bedeutet dies insbesondere auch, dass sie dann nicht vom Compiler für Sie generiert werden. Dies ist jedoch nur ein Ergebnis des Löschens und nicht das, was= delete
wirklich ist.Dieser Auszug aus dem Buch The C ++ Programming Language [4. Ausgabe] - Bjarne Stroustrup beschreibt den wahren Zweck der Verwendung von
=delete
:quelle
Da anscheinend niemand diese Frage beantwortet hat, sollte ich erwähnen, dass es auch eine gibt
=default
.https://docs.microsoft.com/en-us/cpp/cpp/explicitly-defaulted-and-deleted-functions#explicitly-defaulted-functions
quelle
Die Codierungsstandards, mit denen ich gearbeitet habe, hatten für die meisten Klassendeklarationen Folgendes.
Wenn Sie eine dieser 6 verwenden, kommentieren Sie einfach die entsprechende Zeile aus.
Beispiel: Klasse FizzBus benötigt nur dtor und verwendet daher nicht die anderen 5.
Wir kommentieren hier nur 1 aus und installieren die Implementierung an anderer Stelle (wahrscheinlich dort, wo der Codierungsstandard dies vorschlägt). Die anderen 5 (von 6) sind beim Löschen nicht zulässig.
Sie können auch '= löschen' verwenden, um implizite Werbeaktionen mit unterschiedlich großen Werten zu verbieten ... Beispiel
quelle
= delete
ist eine in C ++ 11 eingeführte Funktion. Gemäß=delete
wird diese Funktion aufrufen , nicht erlaubt.Im Detail.
Angenommen, in einer Klasse.
Beim Aufrufen dieser Funktion zur Objektzuweisung ist dies nicht zulässig. Bedeutet, dass der Zuweisungsoperator das Kopieren von einem Objekt auf ein anderes einschränken wird.
quelle
Neuer C ++ 0x Standard. Siehe Abschnitt 8.4.3 im Arbeitsentwurf N3242
quelle
Eine gelöschte Funktion ist implizit inline
(Nachtrag zu bestehenden Antworten)
... Und eine gelöschte Funktion ist die erste Deklaration der Funktion (außer zum Löschen expliziter Spezialisierungen von Funktionsvorlagen - das Löschen sollte bei der ersten Deklaration der Spezialisierung erfolgen), dh Sie können eine Funktion nicht deklarieren und später beispielsweise löschen. bei seiner Definition lokal zu einer Übersetzungseinheit.
Zitieren von [dcl.fct.def.delete] / 4 :
Eine primäre Funktionsvorlage mit einer gelöschten Definition kann spezialisiert werden
Obwohl eine allgemeine Faustregel lautet , Spezialisierungsfunktionsvorlagen zu vermeiden, da Spezialisierungen nicht am ersten Schritt der Überlastungsauflösung teilnehmen, gibt es einige Kontexte, in denen dies nützlich sein kann. Beispiel: Wenn Sie eine nicht überladene primäre Funktionsvorlage ohne Definition verwenden, um allen Typen zu entsprechen, die nicht implizit in eine ansonsten durch Konvertierung übereinstimmende Überladung konvertiert werden sollen. dh implizite Entfernung einer Anzahl von impliziten Konvertierungsübereinstimmungen, indem nur exakte Typübereinstimmungen in der expliziten Spezialisierung der nicht definierten, nicht überladenen primären Funktionsvorlage implementiert werden.
Vor dem gelöschten Funktionskonzept von C ++ 11 konnte man dies tun, indem man einfach die Definition der primären Funktionsvorlage wegließ, aber dies ergab obskure undefinierte Referenzfehler , die dem Autor der primären Funktionsvorlage wohl keine semantische Absicht gaben (absichtlich weggelassen) ?). Wenn wir stattdessen die primäre Funktionsvorlage explizit löschen, werden die Fehlermeldungen, falls keine geeignete explizite Spezialisierung gefunden wird, viel schöner und zeigen auch, dass das Auslassen / Löschen der Definition der primären Funktionsvorlage beabsichtigt war.
Anstatt jedoch einfach eine Definition für die obige primäre Funktionsvorlage wegzulassen und einen obskuren undefinierten Referenzfehler zu erhalten, wenn keine explizite Spezialisierung übereinstimmt, kann die primäre Vorlagendefinition gelöscht werden:
Es wird eine besser lesbare Fehlermeldung angezeigt, bei der auch die Löschabsicht deutlich sichtbar ist (bei der ein undefinierter Referenzfehler dazu führen kann, dass der Entwickler dies für einen unüberlegten Fehler hält).
Zurück zu dem Grund, warum wir diese Technik jemals anwenden wollen? Auch hier können explizite Spezialisierungen hilfreich sein, um implizite Konvertierungen implizit zu entfernen.
quelle
Dies ist neu in C ++ 0x-Standards, in denen Sie eine geerbte Funktion löschen können.
quelle
void foo(int); template <class T> void foo(T) = delete;
alle impliziten Konvertierungen. Es werden nur Argumente vomint
Typ akzeptiert, alle anderen versuchen, eine "gelöschte" Funktion zu instanziieren.