| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > ("STRING" == str) |
| Автор: Alek86 12.2.2008, 15:31 | ||
не знаю как найти, из-за чего тут нет ошибки? Добавлено через 1 минуту и 25 секунд компиляции |
| Автор: Fazil6 12.2.2008, 15:37 |
| из-за того, что operator == реализован не в виде члена класса std::string, а свободной функцией и в этом случае к левому операнду можно применять приведение и так как существует конструктор с параметром const char* левый операнд приводится к std::string и работает оператор сравнения для строк. Короче потому, что operator == не член класса. Добавлено через 1 минуту и 43 секунды |
| Автор: Alek86 12.2.2008, 15:43 |
| хех, я чето думал, конструктор преобразования у basic_string explicit тогда еще вопрос - он не explicit именно задля ("STRING" == str)? Или по другим причинам? |
| Автор: Alek86 12.2.2008, 16:50 | ||
насколько я помню, то explicit делается потому же, из-за чего не рекомендуются операторы каста разве при explicit эта конструкция не будет работать? не будет работать
|
| Автор: Fazil6 12.2.2008, 18:35 | ||
не будет
если запустить, то как и ожидалось получим вызов конструктора с параметром, а если сделать этот конструктор explicit , то не скомпилится, т.к. всетаки нужно приведение типа от типа литерала (const char[8]) к const char* |
| Автор: Alek86 12.2.2008, 18:55 |
| помойму ты что-то путаешь... explicit не может САМ вызываться неявно, а не "не может допускать неявное приведение типа в своем параметре" именно потому его и рекомендуют почаще тыкать |
| Автор: Fazil6 12.2.2008, 19:08 | ||||||||
сори, я неправильно понял твою мысль.
Ты прав, я просто не то имел в виду. Ведь если имеем код
то абсолютно привычно вызвать ее, например вот так
это я и мел в виду, поэтому мне удивительно почему ты вспомнил про explicit применительно к operator==... |
| Автор: Alek86 12.2.2008, 19:10 | ||
не к тому применительно просто казалось, что если это уж такое "правило" - ставить explicit у конструкторов преобразования, то у basic_string он уж точно таков оказалось, что не тут то было... |
| Автор: Fazil6 12.2.2008, 19:19 | ||
ну ты же понимаешь, что правило правилом, но до маразма тоже доводить не нужно. Преобразование char* -> std::string вполне логично и запрещать неявное преобразование в таком случае смысла , я например, не вижу |