Warum C++11-Funktionen gelöscht teilnehmen überlast Auflösung?
Warum C++11 machen "delete
- d" Funktionen teilzunehmen, bei überlast Auflösung?
Warum ist dies nützlich? Oder in anderen Worten, warum sind Sie versteckt, anstatt komplett gelöscht?
Die gleichzeitige Frage C++11 "Nicht-mobilen" Typ.
Siehe die Begründung in dem Vorschlag open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2346.htm#delete
Siehe die Begründung in dem Vorschlag open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2346.htm#delete
InformationsquelleAutor Mehrdad | 2012-12-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hälfte der Zweck der
= delete
syntax ist in der Lage sein zu verhindern, dass Menschen den Aufruf bestimmter Funktionen mit bestimmten Parametern. Dies ist hauptsächlich um zu verhindern, dass implizite Konvertierungen in bestimmten Szenarien. Um zu verbieten, insbesondere überlastung, es hat sich zu beteiligen überlast-Auflösung.Die Antwort, die Sie zitieren, gibt Sie ein perfektes Beispiel:
Wenn
delete
entfernt die Funktion vollständig, das würde den= delete
syntax entspricht:Könnte man dies tun:
Diese legal ist C++. Der compiler wird alle Konstruktoren; keiner von Ihnen nehmen Sie einen integer-Typ direkt. Aber einer von Ihnen kann es dauern, nachdem eine implizite Konvertierung. So werde es nennen.
Dies ist nicht juristischen C++. Der compiler wird alle Konstruktoren, einschließlich der
delete
d lieben. Es wird eine genaue übereinstimmung, überstd::intmax_t
(die genau passen zu jedem integer-literal). So wird der compiler es auszuwählen, und dann sofort ein Fehler ausgegeben, da es ausgewähltdelete
d-Funktion.= delete
bedeutet "ich verbiete diesem," nicht nur, "Das existiert nicht." Es ist eine viel stärkere Aussage.Weil wir brauchen keine speziellen Grammatik zu sagen, "das existiert nicht." Wir bekommen dies implizit, indem Sie einfach nicht deklarieren, die insbesondere "das" in Frage. "Ich verbiete das" stellt ein Konstrukt, das nicht erreicht werden, ohne spezielle Grammatik. So erhalten wir spezielle Grammatik zu sagen "ich verbiete das", und nicht die andere Sache.
Die einzige Funktion, die Sie gewinnen würde, indem er eine explizite "das existiert nicht" Grammatik wäre zu verhindern, dass jemand später zu deklarieren, zu existieren. Und das ist einfach nicht nützlich genug, um eigene Grammatik.
Der copy Konstruktor ist eine spezielle member-Funktion. Jede Klasse immer hat einen copy-Konstruktor. Nur so haben Sie immer eine Kopie Zuweisungsoperator, move-Konstruktor, etc.
Diese Funktionen existieren; die Frage ist nur, ob es legal ist, Sie zu nennen. Wenn Sie versucht zu sagen, dass
= delete
bedeutete, dass Sie nicht vorhanden ist, dann Angabe zu erklären, was es bedeutet, wenn eine Funktion nicht vorhanden ist. Dies ist nicht ein Konzept, das die Spezifikation verarbeitet.Wenn Sie versuchen, eine Funktion aufzurufen, wurde nicht deklariert/definiert noch, dann ist der compiler Fehler. Aber es werden Fehler aufgrund eines undefined identifier, nicht weil eine "Funktion nicht vorhanden" - Fehler (auch wenn Ihr compiler meldet, dass es der Weg). Verschiedene Konstruktoren sind alle aufgerufen, durch überlastung-Auflösung, damit Ihre "Existenz" behandelt wird, in dieser Hinsicht.
In jedem Fall, entweder gibt es eine Funktion deklariert, die über Bezeichner oder ein Konstruktor/Destruktor (erklärt auch über Bezeichner, nur ein Typ-Bezeichner). Operator überladen blendet die id hinter syntaktischer Zucker, aber es ist immer noch da.
Die C++ - Spezifikation nicht in den Griff das Konzept einer "Funktion, die nicht existiert." Es kann mit einer überlast-mismatch. Es kann mit einer überlast Mehrdeutigkeit. Weiß aber nicht, über das, was nicht da ist. So
= delete
ist definiert in Bezug auf die weit mehr nützlich "versucht, um diese fail" eher als weniger nützlich "so tun, ich schrieb nie diese Linie."Wieder re-Lesen Sie den ersten Teil. Sie nicht, dass mit "Funktion nicht vorhanden." Das ist ein weiterer Grund, warum es ist festgelegt, dass Art und Weise: denn einer der wichtigsten Anwendungsfälle des
= delete
syntax ist in der Lage sein, um zu erzwingen, dass der Benutzer bestimmte parameter Typen, explizit umgewandelt werden, und so weiter. Im Grunde Folie implizite Typ-Konvertierungen.Dein Vorschlag würde das nicht tun.
Nein, ich meine, ich erwartet, dass
= delete
im Sinne von "dieses Mitglied existiert nicht", was implizieren würde, könnte es nicht an überlast Auflösung.Und das geht zurück zu meiner ursprünglichen Punkt, das ist der Grund, warum ich es gepostet: wenn
= delete
meinte: "dieses Mitglied existiert nicht", dann ist das erste Beispiel, das ich gepostet wäre nicht in der Lage zu verhindern, dass Menschen von vorbeifahrenden zahlenonlydouble
's Konstruktor, da dieonlydouble
überlastung, die gelöscht wird nicht vorhanden. Wäre es nicht an überlast Auflösung, und daher wäre es nicht verhindern, dass Sie von vorbeifahrenden zahlen. Das ist die Hälfte der Punkt der= delete
syntax: in der Lage sein zu sagen, "Sie können nicht übergeben werden X implizit zu dieser Funktion."Nach dieser Logik, warum tun Sie müssen
=delete
überhaupt? Nach allem können wir sagen, "nicht kopierbar" durch dieselbe Sache zu machen: die Deklaration des copy-Konstruktors/Zuordnung privat. Beachten Sie auch, dass die Deklaration etwas eigenes macht es nicht uncallable; code innerhalb die Klasse kann noch so nennen. Es ist also nicht das gleiche wie= delete
. Nein, die= delete
syntax ermöglicht es uns, etwas zu tun, das höchst unbequeme und undurchschaubare, bevor Sie in ein viel mehr offensichtliche und vernünftige Art und Weise.Da letztere möglich: es heißt "nicht erklären". Dann wird es nicht existieren. Warum müssen wir die syntax zu verstecken, überlast, anstatt zu missbrauchen... sind Sie wirklich Fragen, warum sollten wir ein Mittel haben, um explizit etwas, anstatt zu missbrauchen einige andere Funktion, um die gleiche Wirkung? Es ist einfach mehr für jeden offensichtlich, der den Kodex gelesen, was Los ist. Es macht den code leichter verständlich für den Benutzer und macht es leichter zu schreiben, während auch Probleme zu beheben, die in der Problemumgehung. Nicht wir müssen lambdas.
InformationsquelleAutor Nicol Bolas
C++ Working Draft 2012-11-02 nicht, eine Logik hinter dieser Regel, nur einige Beispiele
InformationsquelleAutor Olaf Dietsche