g++: const discards qualifiers

pourquoi dois-je obtenir un discard qualifiers erreur:

customExc.cpp: In member function virtual const char* CustomException::what() const’:
customExc.cpp: error: passing const CustomException as this argument of char customException::code()’ discards qualifiers

sur l'exemple de code suivant

#include <iostream>


class CustomException: public std::exception {

public:

    virtual const char* what() const throw() {
        static std::string msg;
        msg  = "Error: ";
        msg += code();  //<---------- this is the line with the compile error 
        return msg.c_str();
    }

    char code() { return 'F'; }
};

J'ai cherché partout sur SOF avant concernant les questions similaires.

J'ai déjà ajouté un const sur chaque endroit possible.

Merci de m'éclairer - je ne comprends pas le point...

MODIFIER:
voici les étapes pour reproduire sur Ubuntu-Carmic-32 bits (g++ v4.4.1)

  1. enregistrer un exemple comme customExc.cpp
  2. type make customExc.o

MODIFIER: L'erreur est liée à CustomException. La classe Foo n'a rien à faire avec elle. Donc je l'ai supprimé.

Par ailleurs, vous ne devez pas retourner msg.c_str(), comme msg est détruit dès que what() retourne - ce qui signifie que le pointeur ne sera plus valable lorsque l'utilisateur lit. Vous pourriez envisager de le construire au moment de la construction et de les stocker en tant que membre de la classe.
Je sais. Je voulais juste rester sur un exemple aussi simple que possible. Et depuis le retour de la valeur de what() est const - il ne devrait pas être un problème dans la pratique.
Je ne vois pas ce que la valeur de retour de what() être const a à voir avec la sécurité du retour de la msg.c_str()... c'est garanti à un point de non-existence en mémoire, ce qui est un comportement indéfini. ne le faites pas!
vous où le droit!

OriginalL'auteur | 2010-03-09