Warum wird der Konstruktor std :: bitset mit einem unsigned long long-Argument nicht explizit markiert?

9

Die Standardbibliotheksklassenvorlage std::bitset<N> hat einen Konstruktor (C ++ 11 und höher, unsigned long Argument vor C ++ 11)

%Vor%

Im Gegensatz zu vielen Best-Practice-Richtlinien ist dieser Konstruktor mit einem Argument nicht als explicit markiert. Was ist der Grund dafür?

    
TemplateRex 14.09.2014, 12:48
quelle

1 Antwort

4

Explizite Konstruktion

Der Haupteinwand gegen einen explicit -Konstruktor ist, dass die Kopierinitialisierung von Ganzzahlen ohne Vorzeichen nicht mehr funktioniert

%Vor%

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).

Mixed-Mode Bit-Twiddling

Obwohl bitset jedoch leicht von unsigned long initialisiert wird, gibt es ansonsten unvollständige Operationen im gemischten Modus ( & , | oder ^ ):

%Vor%

Dies könnte behoben werden, indem überladene Operatoren vorgeschlagen werden, um Bit-Twiddling im gemischten Modus zu unterstützen:

%Vor%

Überladene Operatoren als Elementfunktionen

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:

%Vor%

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.

    
TemplateRex 17.09.2014, 12:44
quelle