2010-08-04 18 views
3

Pourquoi le programme suivant donne-t-il un avertissement?Pourquoi le programme suivant génère-t-il une erreur?

Remarque: Il est évident que l'envoi d'un pointeur normal à une fonction nécessitant un pointeur const ne donne aucun avertissement.

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

je reçois l'erreur suivante,

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

Est-ce que votre compilateur signale une erreur ou un avertissement? (et, si cela ne fait que rapporter un avertissement, quel compilateur utilisez-vous? Il vaut mieux signaler une erreur) –

+0

@James: Mon compilateur [gcc version 2.95.3] renvoie une erreur. Éditera la question tout de suite. Merci pour la notification. – joshu

+2

@Prabhu: Ah, d'accord. J'avais d'abord pensé qu'il pourrait être une ancienne version de Visual C++ (_pas que je pense que Visual C++ manque de conformité aux normes ... pas du tout ... non ... _). –

Répondre

10

Ce code constitue une violation correcte de const.

Le problème est que ce code est fondamentalement dangereux car vous pourriez modifier par inadvertance un objet const. Le C++ FAQ Lite a un excellent exemple dans la réponse à "Why am I getting an error converting a Foo**Foo const**?"

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!! 
    ... 
} 

(exemple de Marshall Cline C++ FAQ document Lite, www.parashift.com/c++-faq-lite/)

Vous pouvez résoudre le problème par les deux niveaux de const admissibles de indirection:

void sam(char const* const* p) { }