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.
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.
gx_ hat korrekt angegeben, dass 0 in std :: nullptr_t konvertiert werden kann. Folgendes wird in Bezug auf Ihre Absicht funktionieren.
%Vor%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.
Tags und Links c++ constructor explicit-constructor initializer