Чтобы пояснить, что я написал в некоторых комментариях, вот причина , а не , чтобы сделать это в коде C ++.
Кто-то пишет, скажем, строковый класс и решает добавить оператор приведения к 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;
};
Теперь кто-то слепо применяет constant == variable
«защитный» паттерн программирования:
BadString s("foo");
if ("foo" == s) // Oops. This compares pointers and is never true.
{
// ...
}
Это, IMO, более коварная проблема, чем случайное назначение, потому что с сайта вызова нельзя сказать, что что-то явно не так.
Конечно, настоящие уроки:
- Не пишите свои собственные строковые классы.
- Избегайте неявных операторов приведения, особенно при выполнении (1).
Но иногда вы имеете дело со сторонними API, которые вы не можете контролировать. Например, строковый класс _bstr_t
, общий для программирования Windows COM, страдает этим недостатком.