Afin de clarifier ce que j'ai écrit dans certains commentaires, voici une raison de ne pas faire cela dans le code C++.
Quelqu'un écrit une chaîne de classe et décide d'ajouter un opérateur de cast pour const char*
:
class BadString
{
public:
BadString(const char* s) : mStr(s) { }
operator const char*() const { return mStr.c_str(); }
bool operator==(const BadString& s) { return mStr == s.mStr; }
// Other stuff...
private:
std::string mStr;
};
Maintenant, quelqu'un s'applique aveuglément l' constant == variable
"sur la défensive" de programmation de modèle:
BadString s("foo");
if ("foo" == s) // Oops. This compares pointers and is never true.
{
// ...
}
C'est, IMO, un problème plus insidieux que accidentel d'affectation parce que vous ne pouvez pas dire à partir du site d'appel que tout ce qui est évidemment faux.
Bien sûr, les véritables leçons sont:
- Ne pas écrire votre propre chaîne de classes.
- Évitez les opérateurs de transtypage implicite, en particulier lorsque vous faites (1).
Mais parfois, vous avez à traiter avec des tiers Api vous ne pouvez pas contrôler. Par exemple, l' _bstr_t
chaîne de caractères de la classe courante sous Windows COM programmation souffre de ce défaut.