Frage

Warum wird das folgende Programm eine Warnung aus?

Hinweis . Seine Hand, dass ein normalen Zeiger auf eine Funktion erfordern const Zeiger zu senden gibt keine Warnung

#include <stdio.h>
void sam(const char **p) { }
int main(int argc, char **argv)
{
    sam(argv);
    return 0;
}

Ich erhalte die folgenden Fehler,

In function `int main(int, char **)':
passing `char **' as argument 1 of `sam(const char **)' 
adds cv-quals without intervening `const'
War es hilfreich?

Lösung

Dieser Code verletzt const Korrektheit.

Das Problem ist, dass dieser Code grundsätzlich unsicher ist, weil Sie versehentlich ein konstantes Objekt ändern könnten. Die C ++ FAQ Lite verfügt über ein ausgezeichnetes Beispiel dafür in der Antwort auf " Warum bin ich erhalte eine Fehlermeldung ein Foo** ? Foo const** Umwandlung? "

class Foo {
 public:
   void modify();  // make some modify to the this object
 };

 int main()
 {
   const Foo x;
   Foo* p;
   Foo const** q = &p;  // q now points to p; this is (fortunately!) an error
   *q = &x;             // p now points to x
   p->modify();         // Ouch: modifies a const Foo!!
   ...
 }

(Beispiel von Marshall Cline C ++ FAQ Lite Dokument, www.parashift.com/c++- FAQ-lite / )

Sie können das Problem beheben, indem const-Qualifikation beide Dereferenzierungsebenen:

void sam(char const* const* p) { }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top