2010-08-09 6 views
5

Der Modifikator const in C++ vor Stern bedeutet, dass mit diesem Zeiger der Wert, auf den verwiesen wird, nicht geändert werden kann, während der Zeiger selbst auf etwas anderes gerichtet werden kann. In der untennichtkonstantes Zeigerargument zu einem const Doppelzeigerparameter

void justloadme(const int **ptr) 
{ 
    *ptr = new int[5]; 
} 

int main() 
{ 
    int *ptr = NULL; 
    justloadme(&ptr); 
} 

justloadme Funktion sollte nicht die ganzzahligen Werte zu bearbeiten erlaubt werden, durch die bestandene param hingewiesen (falls vorhanden), während es den int * Wert bearbeiten können (da die const nicht nach dem ersten Stern) , aber warum bekomme ich einen Compilerfehler in GCC und VC++?

GCC: Fehler: ungültige Umwandlung int**-const int**

VC++: Fehler C2664: 'justloadme': Konvertierung des Parameters 1 von 'int **' in 'const int **'. Conversion verliert Qualifier

Warum heißt es, dass die Konvertierung Qualifier verliert? Ist es nicht der const Qualifier? Darüber hinaus ist es nicht ähnlich zu strlen(const char*), wo wir eine nicht-const char*

+4

http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.17 – Anycorn

Antwort

8

Wie in den meisten Fällen ist der Compiler richtig und Intuition falsch. Das Problem ist, dass, wenn diese bestimmte Zuordnung erlaubt wurde Sie const-Korrektheit in Ihrem Programm brechen könnte:

const int constant = 10; 
int *modifier = 0; 
const int ** const_breaker = &modifier; // [*] this is equivalent to your code 

*const_breaker = & constant; // no problem, const_breaker points to 
           // pointer to a constant integer, but... 
           // we are actually doing: modifer = &constant!!! 
*modifier = 5;     // ouch!! we are modifying a constant!!! 

Die Linie markiert mit [*] ist der Schuldige für diese Verletzung, und für diesen bestimmten Grund nicht zulässig. Die Sprache ermöglicht das Hinzufügen const zur letzten Ebene, aber nicht die erste:

int * const * correct = &modifier; // ok, this does not break correctness of the code 
+0

Obwohl es angenehm Um das "const" -Fiasko zu modifizieren, tut dies der Compiler. Aber mit 'int * const * correct' kann ich nicht einmal '* ptr = new int [5];'. Was mache ich? – legends2k

+1

Das Problem liegt wahrscheinlich darin, dass Sie nicht möchten, was Sie schreiben. Was willst du machen? Die Signatur nimmt ein 'const int **', aber du übergibst ein 'int ** 'und behandelst es innerhalb der Funktion als' int **' ... willst du das wirklich 'const' in der Signatur? –

+1

Oh, jetzt verstehe ich es! Was ich versuche, ist konzeptionell falsch, also ja, du hast Recht. Vielen Dank! – legends2k

Verwandte Themen