Избегайте операторов неявного преобразования
Причина
Неявные преобразования могут быть существенными (например, double в int), но часто вызывают неожиданности (например, String в строку в стиле C).
Примечание
Предпочитайте явно названные преобразования до тех пор, пока не будет продемонстрирована серьёзная необходимость. Под «серьёзной необходимостью» понимается причина, фундаментальная в прикладной области (например, преобразование целого числа в комплексное) и часто востребованная. Не вводите неявные преобразования (через операторы преобразования или не-explicit конструкторы) только ради небольшого удобства.
Пример
struct S1 {
string s;
// ...
operator char*() { return s.data(); } // ПЛОХО, вероятно вызовет неожиданности
};
struct S2 {
string s;
// ...
explicit operator char*() { return s.data(); }
};
void f(S1 s1, S2 s2)
{
char* x1 = s1; // OK, но может вызывать неожиданности во многих контекстах
char* x2 = s2; // ошибка (и это, как правило, хорошо)
char* x3 = static_cast<char*>(s2); // можно быть явным (на ваш страх и риск)
}
Неожиданное и потенциально опасное неявное преобразование может возникнуть в сколь угодно сложно обнаруживаемых контекстах, например:
S1 ff();
char* g()
{
return ff();
}
Строка, возвращённая ff(), уничтожается до того, как может быть использован возвращённый на неё указатель.
Контроль
Помечать все не-explicit операторы преобразования.