explicit-constructor

___ answer17217899 ___

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.

    
___ answer17217457 ___

Eine Idee, die ich hatte, war:

%Vor%

Verhält sich das vernünftig?

    
___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ qstnhdr ___ Kann ich eine implizite Initialisierung auf 0 überladen? ___ qstntxt ___

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"

    
___ tag123constructor ___ Eine spezielle Art von Subroutine, die bei der Erstellung eines Objekts aufgerufen wird. ___ answer17218119 ___

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.

    
___ tag123explicit_constructor ___ In C ++ verhindert die Verwendung des expliziten Schlüsselworts vor dem Konstruktor, dass der Compiler diesen Konstruktor für implizite Konvertierungen verwendet. ___ tag123initializer ___ Initialisierer werden aufgerufen, um eine neue Instanz eines bestimmten Typs zu erstellen. In seiner einfachsten Form ist ein Initialisierer wie eine Instanzmethode ohne Parameter ___ answer17217152 ___
%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 %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%     
___
1
Antwort

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

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 n...
14.09.2014, 12:48
4
Antworten

Implizite Konvertierung von int in Vektor?

vector<T> hat einen Konstruktor, der die Größe des Vektors annimmt und, soweit ich weiß, explizit ist, was durch die Tatsache bewiesen werden kann, dass der folgende Code nicht kompiliert werden kann %Vor% Was ich nicht verstehen...
07.05.2013, 20:25
4
Antworten

Kann ich eine implizite Initialisierung auf 0 überladen?

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"     
20.06.2013, 14:58