Kann ich eine implizite Initialisierung auf 0 überladen?

8

Ist es möglich, eine Klasse so zu schreiben, dass diese gültig ist:

%Vor%

Aber das sind nicht:

%Vor%

Im Wesentlichen ist meine Regel "Eine Konstante 0 ist implizit in eine Foo konvertierbar, aber kein anderer Wert ist"

    
Eric 20.06.2013, 14:58
quelle

4 Antworten

5

Wenn es euch nichts ausmacht, Foo b = nullptr; zu arbeiten, ist es ziemlich einfach zu hacken. Habe einen expliziten Konstruktor von int und einen impliziten von std::nullptr_t .

Wenn Ihnen diese Arbeit etwas ausmacht, bin ich mir nicht sicher, ob das möglich ist. Die einzige Möglichkeit, zwischen einem Literal 0 und anderen Ganzzahl-Literalen zu unterscheiden, ist die implizite Umwandlung in Zeiger und nullptr_t . Daher wird nullptr einen nullptr_t -Parameter einem Zeiger-Parameter vorziehen, so dass Sie beide Konstruktoren aus nullptr arguments filtern können. Die Konvertierungen von 0 in Zeiger und nullptr_t haben jedoch den gleichen Rang, das würde 0 Argumente mit einer Mehrdeutigkeit beenden.

Hmm ... so etwas funktioniert vielleicht:

%Vor%

Ich habe das nicht wirklich versucht. Theoretisch sollte die Vorlage nur dann an der Überladungsauflösung teilnehmen, wenn das Argument nullptr ist, weil andernfalls SFINAE es tötet. In diesem Fall sollte es jedoch besser sein als der Zeigerkonstruktor.

    
Sebastian Redl 20.06.2013, 15:36
quelle
0
%Vor%

Ruft einen nicht expliziten Konstruktor von Foo auf, der ein int als Argument verwendet. Im Wesentlichen wird diese Zeile dasselbe tun, indem Sie versuchen, int mit diesem int-Konstruktor in Foo zu konvertieren.

%Vor%

Sie können nicht verhindern, dass bestimmte Werte dieses int direkt verarbeitet werden. Wenn Sie Ihren Konstruktor explicit haben, können Sie auch nicht die nächste Zeile schreiben.

%Vor%

gx_ hat korrekt angegeben, dass 0 in std :: nullptr_t konvertiert werden kann. Folgendes wird in Bezug auf Ihre Absicht funktionieren.

%Vor%     
Pixelchemist 20.06.2013 15:02
quelle
-1

Eine Idee, die ich hatte, war:

%Vor%

Verhält sich das vernünftig?

    
Eric 20.06.2013 15:16
quelle
-1

Ich gebe zu, dass ich die Rvalue-Semantik von C ++ 11 noch nicht vollständig beherrscht habe, aber das scheint zu tun, was Sie wollen:

%Vor%

Ergebnis:

  

prog.cpp: 11: Fehler: kann 'int' lvalue nicht an 'int & amp; & amp;'

binden

Kommentare willkommen, wenn dieser Code irgendwelche Vorbehalte hat, die ich nicht bemerkt habe, oder wenn Sie mich beruhigen können, dass es nicht tut.

    
Oktalist 20.06.2013 15:46
quelle