Ich werde meine Frage mit Code illustrieren:
%Vor%Wenn ich diesen Code (in VS2008) starte, bekomme ich folgendes: Fehler C2664: 'PrintInt': kann Parameter 1 nicht von 'unsigned char *' in 'const unsigned char * & amp;' konvertieren. Wenn ich den Kommentar "const" auskommentiere, funktioniert es gut.
Aber sollte nicht Zeiger implizit in const Zeiger umgewandelt werden und dann Referenz genommen werden? Habe ich Unrecht zu erwarten, dass das funktioniert? Danke!
Wenn der Zeiger wie vorgeschlagen in einen const-Zeiger konvertiert wird, ist das Ergebnis dieser Konvertierung ein temporärer Wert, ein rvalue . Sie können einen nicht konstanten Verweis auf einen Rvalue nicht anhängen - es ist in C ++ illegal.
Dieser Code wird beispielsweise aus einem ähnlichen Grund nicht kompiliert
%Vor% Auch wenn int
in den Typ double
konvertierbar ist, bedeutet dies dennoch nicht, dass Sie eine double &
Referenz an das Ergebnis dieser Konvertierung anhängen können.
Jedoch kann eine const-Referenz (d. h. eine Referenz des const-Referenztyps) an einen rvalue angehängt werden, was bedeutet, dass dieser Code vollkommen in Ordnung kompiliert wird
%Vor%In Ihrem Fall, wenn Sie Ihre Funktion als
deklarieren %Vor%Der Code wird kompiliert.
Das wird die const-Korrektheit brechen:
%Vor% Wenn die Konvertierung erlaubt war, würde der obige Code kompilieren. Sobald Sie cp
mit p
(verboten in der Sprache) initialisiert haben, handelt es sich um Aliase. Jetzt können Sie mit cp
auf jedes konstante Objekt zeigen, da es sich um einen Zeiger auf ein konstantes Objekt handelt. Das Ändern des Werts, auf den p
zeigt, ist ebenfalls ein gültiger Code, da es ein Zeiger auf ein nicht konstantes Objekt ist, aber da p
und cp
identisch sind, würde es eine Konstante verändern.
Sie können einen Verweis nicht auf einen Zeiger konvertieren, da der Zeiger null sein kann und eine Referenz nicht. Mit anderen Worten, die Referenz ist restriktiver als ein Zeiger. Eine Referenz ist immer ein gültiger Zeiger, aber das Gegenteil ist nicht immer wahr.