warum keine implizite Konvertierung vom Zeiger zum Verweis auf const Zeiger

8

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!

    
user316606 25.05.2010, 20:24
quelle

4 Antworten

10

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.

    
AnT 25.05.2010, 20:27
quelle
7

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.

    
quelle
0

Ich denke, du brauchst:

void PrintInt(const unsigned char* const& ptr)

Wenn Sie einen Const-Zeiger als Referenz übergeben möchten.

    
James 25.05.2010 20:27
quelle
0

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.

    
Alessandro Teruzzi 14.06.2011 16:29
quelle

Tags und Links