Die Standardbibliotheksklassenvorlage std::bitset<N>
hat einen Konstruktor (C ++ 11 und höher, unsigned long
Argument vor C ++ 11)
Im Gegensatz zu vielen Best-Practice-Richtlinien ist dieser Konstruktor mit einem Argument nicht als explicit
markiert. Was ist der Grund dafür?
Der Haupteinwand gegen einen explicit
-Konstruktor ist, dass die Kopierinitialisierung von Ganzzahlen ohne Vorzeichen nicht mehr funktioniert
Da std::bitset<N>
als eine Verallgemeinerung von unsigned int
gedacht ist, wurde der Konstruktor wahrscheinlich implizit gemacht, um die Anpassung des existierenden C-style Bit-Twiddling-Codes basierend auf rohen unsigned int
zu ermöglichen. Wenn der Konstruktor explicit
erstellt würde, wäre viel vorhandener Code kaputt gegangen (und das Hinzufügen wird jetzt viel vorhandenen Code zerstören).
AKTUALISIEREN : Ich habe einige Standardarchäologie gemacht und dabei N0624 vom Januar 1995, das vorgeschlagen hat, das brandneue Schlüsselwort explicit
zu allen Konstruktoren mit einem Argument im Entwurf vor der Standardbibliothek hinzuzufügen. Dies wurde bei einem Treffen im März 1995 (Austin) zur Abstimmung gestellt. Wie in N0661 dokumentiert, Der unsigned long
Konstruktor für bitset
wurde nicht explicit
gemacht (einstimmig, aber ohne Motivation).
Obwohl bitset
jedoch leicht von unsigned long
initialisiert wird, gibt es ansonsten unvollständige Operationen im gemischten Modus ( &
, |
oder ^
):
Dies könnte behoben werden, indem überladene Operatoren vorgeschlagen werden, um Bit-Twiddling im gemischten Modus zu unterstützen:
%Vor% Die schizophrene Natur von std::bitset
in Bezug auf die Mixed-Mode-Funktionalität ist auch in operator==
und operator!=
vorhanden. Dies sind Elementfunktionen, die eine implizite Konvertierung für ihre rhs-Argumente haben, aber nicht für ihr lhs-Argument (den this
-Zeiger, der einer Template-Argumentableitung unterliegt). Dies führt zu folgendem:
Die Ursprünge dieses Verhaltens ergeben sich aus dem Vorschlag von 1992 N0128 . Der Zeitpunkt dieses Angebots, der weitgehend in der Funktionalität des zukünftigen std::bitset
eingeschlossen war, war vor Funktionsschablonen mit nicht typisierten Vorlagenparametern. Die einzige mögliche Problemumgehung zu dieser Zeit bestand darin, alle überladenen Operator-Member-Funktionen anstelle von Nicht-Member-Funktionen zu machen. Dies wurde später nie geändert, als eine modernere Schablonentechnologie verfügbar wurde (siehe auch dieses Q & A; warum könnte dies Code brechen.
Tags und Links c++ implicit-conversion bitset unsigned-long-long-int explicit-constructor