Le code suivant ne compile pas:Pourquoi le compilateur n'est-il pas plus intelligent dans ce problème de surcharge de fonction const?
#include <iostream>
class Foo {
std::string s;
public:
const std::string& GetString() const { return s; }
std::string* GetString() { return &s; }
};
int main(int argc, char** argv){
Foo foo;
const std::string& s = foo.GetString(); // error
return 0;
}
J'obtiens l'erreur suivante:
const1.cc:11: error:
invalid initialization of reference of type 'const std::string&'
from expression of type 'std::string*
Il ne fait un certain sens, car foo
est pas de type const Foo
, mais juste Foo
, de sorte que le compilateur veut utiliser la fonction non-const. Mais encore, pourquoi ne peut-il pas reconnaître que je veux appeler la fonction const GetString
, en regardant la (type de) variable à laquelle je l'assigne? J'ai trouvé ce genre de surprenant.
Si vous allez jeter des insultes * * autour, être préparés pour le compilateur de se demander pourquoi vous n'êtes pas assez intelligent pour définir des types de retour compatibles pour vos fonctions membres const-surcharge ;-) Si vous voulez appeler une version const d'une fonction sur un objet non-const, vous static_cast: 'const std :: string & s = static_cast (foo) .GetString();' –
en fait, maintenant j'ai une idée pour une série de questions spoof stackoverflow "Pourquoi mon programmeur oublie-t-il de rendre virtuels les destructeurs de classe de base?", "Pointers: pourquoi les humains ne peuvent-ils pas les comprendre ou simplement cesser de les utiliser?", "Le code de mon humain ne compile pas, peu importe ce qu'il essaie, est-ce que j'ai un bug? etc. Probablement jamais à n'importe quoi. –
@Steve: Excellente idée. N'hésitez pas à emprunter/mangle/étendre l'extrait de code dans ma réponse. –