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)
- enregistrer un exemple comme
customExc.cpp
- 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
Je sais. Je voulais juste rester sur un exemple aussi simple que possible. Et depuis le retour de la valeur de
Je ne vois pas ce que la valeur de retour de
vous où le droit!
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
Vous devez vous connecter pour publier un commentaire.
CustomException::what
appelsCustomException::code
.CustomException::what
est un const méthode, comme indiqué par la const aprèswhat()
. Depuis, c'est un const méthode, il ne peut pas faire tout ce qui peut modifier lui-même.CustomException::code
n'est pas un const méthode, ce qui signifie qu'il ne pas promesse de ne pas modifier lui-même. DoncCustomException::what
ne peux pas appelerCustomException::code
.Noter que const méthodes ne sont pas nécessairement liés à la const instances.
Foo::bar
peut déclarer sesexc
variable non-const et appel const méthodes commeCustomException::what
; cela signifie simplement queCustomException::what
engage à ne pas modifierexc
, mais d'un autre code peut.Le C++ FAQ a un peu plus d'informations sur const méthodes.
... what() promises not to modify exc ...
OriginalL'auteur Josh Kelley
OriginalL'auteur amit
Votre
what()
est une fonction membre const, maiscode()
ne l'est pas.Il suffit de changer
code()
àcode() const
.OriginalL'auteur leiz
Votre
code()
fonction de membre n'est pas déclaréconst
. L'appel de la non-const fonctions de membre de const fonctions de membre (what()
dans ce cas) est illégal.Faire de votre
code()
membre const.Un const sur une méthode signifie, que ce sera un pointeur vers const dans cette méthode. Si vous êtes conscient de cela, le message d'erreur a le sens parfait: lorsque vous essayez d'appeler
code()
dewhat()
, vous tentez de convertir(const CustomException*) this
en(CustomException*)this
, ce qui à jeter le cv qualificatif(s) (const)Je pense que @rmeador fait un bon point. Je suis habitué à ce message d'erreur, mais il pourrait tout aussi bien dire "
Cannot call ‘char customException::code()’ from ‘virtual const char* CustomException::what() const’ because ‘char customException::code()’ is not a const member function.
"FWIW, Clang donne une belle erreur (comme c'est souvent le cas):
test.cpp:11:12: error: member function 'code' not viable: 'this' argument has type 'const CustomException', but function is not marked const msg += code(); // <---------- this is the line with the compile error ^~~~ test.cpp:15:8: note: 'code' declared here char code() { return 'F'; }
OriginalL'auteur AnT