Wenn es euch nichts ausmacht, %code% zu arbeiten, ist es ziemlich einfach zu hacken. Habe einen expliziten Konstruktor von %code% und einen impliziten von %code% .
Wenn Ihnen diese Arbeit etwas ausmacht, bin ich mir nicht sicher, ob das möglich ist. Die einzige Möglichkeit, zwischen einem Literal %code% und anderen Ganzzahl-Literalen zu unterscheiden, ist die implizite Umwandlung in Zeiger und %code% . Daher wird %code% einen %code% -Parameter einem Zeiger-Parameter vorziehen, so dass Sie beide Konstruktoren aus %code% arguments filtern können. Die Konvertierungen von %code% in Zeiger und %code% haben jedoch den gleichen Rang, das würde %code% 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 %code% ist, weil andernfalls SFINAE es tötet. In diesem Fall sollte es jedoch besser sein als der Zeigerkonstruktor.
Eine Idee, die ich hatte, war:
%Vor%Verhält sich das vernünftig?
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 %code% ist implizit in eine %code% konvertierbar, aber kein anderer Wert ist"
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.
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 %code% 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%