"Ungültige Umwandlung von »GLvoid**« in »const GLvoid**«". Warum?



  • Ich will die OpenGL-Routine glMultiDrawElements aufrufen, die folgende Signatur hat:

    void glMultiDrawElements(GLenum, const GLsizei*, GLenum, const GLvoid**, GLsizei)
    

    Als 4. Parameter verwende ich dabei eine Variable vom Typ GLuint**, was zu folgendem Kompilierfehler führt:

    Fehler: ungültige Umwandlung von »GLuint**« in »const GLvoid**«
    Fehler: Argument 4 von »void glMultiDrawElements(GLenum, const GLsizei*, GLenum, const GLvoid**, GLsizei)« wird initialisiert

    Wandle ich die Variable per reinterpret_cast in den Typ GLvoid**, so kommt immer noch die Meldung:

    Fehler: ungültige Umwandlung von »GLvoid**« in »const GLvoid**«
    Fehler: Argument 4 von »void glMultiDrawElements(GLenum, const GLsizei*, GLenum, const GLvoid**, GLsizei)« wird initialisiert

    Erst wenn ich darum noch einen const_cast setze, lässt es sich kompilieren.

    Warum ist das so? Ich dachte bisher, ein const_casts wird gebraucht, wenn man die Konstantheit wegkriegen will; eine Variable als konstanten Parameter einer Funktion zu übergeben geht doch normalerweise aber implizit?

    Ich verwende GCC 4.3.0 und hoffe, jemand erleuchtet mich bei dieser Frage!
    Danke schon mal!



  • A single const_cast expression may add or remove any number of const or volatile modifiers.



  • Äh danke, aber das ist keine Antwort auf meine Frage. Ich hab ja bereits geschrieben, dass es mit dem const_cast vom Compiler angenommen wird, und dass man die Konstantheit dazucasten kann, ist ja auch klar. Aber ich will ja wissen, warum ich es muss, normalerweise passiert das ja implizit!



  • Hallo,

    ein GLVoid** könnte implizit in einen GLVoid** const umgewandelt werden, nicht aber in einen GLVoid const **.



  • Danke,

    hast Du auch eine Erklärung (gerne auch verlinkt), warum das so ist?



  • C++ Standard, 4.4 (Qualification conversions), Punkt 4.

    Folgendes Beispiel aus dem Standard:

    if a program could assign a pointer of type T** to a pointer of type const T** (that is, if line //1 below was allowed), a program could inadvertently modify a const object (as it is done for line //2). For example,

    int main() {
      const char c = 'c';
      char* pc;
      const char** pcc = &pc; //1: not allowed
      *pcc = &c;
      *pc = 'C'; //2: modifies a const object
    }
    


  • Stimmt, das leuchtet ein, dankeschön!

    Die Frage ist beantwortet.


Anmelden zum Antworten