warum keine implizite Konvertierung von Zeiger auf Referenz auf const-Zeiger
Werde ich veranschaulichen meine Frage mit code:
#include <iostream>
void PrintInt(const unsigned char*& ptr)
{
int data = 0;
::memcpy(&data, ptr, sizeof(data));
//advance the pointer reference.
ptr += sizeof(data);
std::cout << std::hex << data << " " << std::endl;
}
int main(int, char**)
{
unsigned char buffer[] = { 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, };
/* const */ unsigned char* ptr = buffer;
PrintInt(ptr); //error C2664: ...
PrintInt(ptr); //error C2664: ...
return 0;
}
Wenn ich diesen code ausführen (in VS2008) bekomme ich: error C2664: 'PrintInt' : cannot convert parameter 1 from 'unsigned char *' in 'const unsigned char *&'. Wenn ich die Auskommentierung der "const" - Kommentar, es funktioniert gut.
Allerdings sollten sich nicht-Zeiger implizit konvertieren in const-Zeiger, und dann Bezug genommen werden? Bin ich falsch mit der Erwartung an diese Arbeit? Danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn der Zeiger umgewandelt wird, um ein const-Zeiger ist, wie Sie vorschlagen, dann wird das Ergebnis der Umwandlung ist ein temporärer Wert, ein rvalue. Sie können nicht anfügen, eine nicht-const Referenz auf ein rvalue - es ist illegal in C++.
Zum Beispiel, dieser code wird nicht kompiliert aus einem ähnlichen Grund
Obwohl Typ
int
is Cabrio Typdouble
es noch nicht bedeutet, dass Sie können anfügen einerdouble &
Referenz zu dem Ergebnis, dass die Konvertierung.Allerdings eine const-Referenz (d.h. eine Referenz von Referenz-auf-const-Art) kann angebracht werden, um ein rvalue, was bedeutet, dass dieser code kompiliert wird völlig in Ordnung
In Ihrem Fall, wenn Sie erklären Ihre Funktion als
der code kompiliert wird.
Die unterbrochen werden, die const-Korrektheit:
Wenn die Konvertierung erlaubt war, würde der obige code kompiliert. Sobald Sie initialisiert
cp
mitp
(verboten in der Sprache) Sie sind Aliase. Jetzt können Siecp
zu betonen, dass es eine Konstante Objekt, denn es ist ein Zeiger auf eine Konstante Objekt. Ändern Sie den Wert zeigtep
ist auch Gültiger code, da es ein Zeiger auf einen nicht-const-Objekt, aber dap
undcp
sind die gleichen, es wäre das ändern einer Konstante.Ich glaube, Sie brauchen:
void PrintInt(const unsigned char* const& ptr)
wenn Sie wollen, eine const-Zeiger-Verweis.
Sie können nicht konvertieren eine Referenz auf einen Zeiger, da der Zeiger kann null sein, und kann eine Referenz nicht. In anderen Worten, die Referenz restriktiver ist, dass ein Zeiger. Eine Referenz ist immer ein Gültiger Zeiger, aber das Gegenteil ist nicht immer wahr.