Per chiarire cosa ho scritto in alcuni commenti, ecco un motivo non per farlo in codice C++.
Qualcuno scrive, ad esempio, una classe string e decide di aggiungere un operatore di cast per 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;
};
Ora qualcuno si applica ciecamente il modello constant == variable
programmazione "difensivo":
BadString s("foo");
if ("foo" == s) // Oops. This compares pointers and is never true.
{
// ...
}
Questo è , IMO, un problema più insidioso dell'assegnazione accidentale perché non si può dire dal sito di chiamata che qualcosa è ovviamente sbagliato.
Naturalmente, le vere lezioni sono:
- Non scrivere le proprie classi di stringa.
- Evita gli operatori di cast impliciti, specialmente quando si esegue (1).
Ma a volte hai a che fare con API di terze parti che non puoi controllare. Ad esempio, il comune della classe di stringa _bstr_t
nella programmazione COM di Windows soffre di questo difetto.
+1 per davvero un buon titolo di domanda . – OregonGhost
sono sicuro di aver visto questa domanda più di una volta, ma non riesco a trovarla ora. –
@ Idan: sono rimasto sorpreso di non averlo trovato, ma dopo 5 minuti di ricerca ho rinunciato ;-) –