error: invalid conversion from ‘char**’ to ‘const char**’



  • Hallo,

    Warum? Ich dachte Typ X zu Typ const X geht immer!?

    ideone kompiliert mit C++14

    void f(const char** ) {}
    
    int main(int , char** argv){
    	f(argv);
    }
    

    Fail.



  • Ich dachte Typ X zu Typ const X geht immer!?

    Und ist das const X?


  • Mod

    Kontraintuitiver Klassiker: Warum schlägt die Konvertierung fehl, wo der Zieltyp doch qualifizierter ist? Tatsächlich muss man ein wenig weiterdenken: wäre diese Konvertierung erlaubt, wären wir in der Lage, einen Zeiger vom Typ X* auf ein Objekt vom Typ const X zeigen zu lassen, d.h. wir könnten ohne explizite Casts ein Szenario erreichen, in dem wir Qualifikation verlieren:

    const int constant;
    
    int** p = ...;
    int const** q = p; // hypothetisch
    *q = &constant;
    **p = 6; // undefiniert, aber wohlgeformt
    

    Daher auch die entsprechende Regel in [conv.qual].


  • Mod

    const char konstante = 'k';
    char *p;
    const char** pp = &p;  // Verboten. Aber mal angenommen es wäre erlaubt, so wie du es die vorstellst.
    *pp = &konstante;  // Ganz legitime Operation. Aber indirekt zeigt p nun auf die Konstante!
    *p = 'x';  // Und jetzt haben wir über (den nicht-const Pointer) p die Konstante ändern können.
    

    edit: Da war Arcoth schneller.


  • Mod

    SeppJ schrieb:

    edit: Da war Arcoth schneller.

    Ein bedeutungsloses Kopf-an-Kopf-Rennen, so zwei Stunden nach Verfassung des Posts? 😃


  • Mod

    Arcoth schrieb:

    SeppJ schrieb:

    edit: Da war Arcoth schneller.

    Ein bedeutungsloses Kopf-an-Kopf-Rennen, so zwei Stunden nach Verfassung des Posts? 😃

    Und dann halt beide innerhalb weniger Minuten 😃


Log in to reply