Страницы

Поиск по вопросам

понедельник, 8 апреля 2019 г.

C++ неявное приведение типов

подскажите пожалуйста, как в компилятор С++ разрешает проблему неявного привидения типов. В частности интересует вопрос: почему в первом случае компилятор сможет построить цепочку преобразований, а во втором нет? Или подскажите где можно об этом почитать.
1
struct String { operator int(); }; int main() { String s("Hello"); if (s) {} }
2
struct String { operator String2(); };
struct String2 { operator bool(); }; int main() { String s("Hello"); if (s) {} }


Ответ

В стандарте C++ описаны несколько последовательностей неявного конвертирования, которые могут случаться в программах ([over.best.ics]). Ваш случай описан в [over.ics.user], в котором говорится, что определённая пользователем функция конвертирования, может использоваться лишь один раз во всей последовательности. Т.е. последовательность, которая содержит использование переопределённого оператора преобразования, может содержать не более двух стандартных преобразований и лишь одно преобразование определённое пользователем.
Ваш первый случай:
Конвертировать s в int - определённое пользователем преобразование. Конвертировать int в bool — стандартное преобразование.
Т.е. всё нормально, не более одного пользовательского преобразования и не более 2-х стандартных преобразований.
Ваш второй случай (гипотетически):
Конвертировать s в String2 - определённое пользователем преобразование. Конвертировать String2 в bool - определённое пользователем преобразование.
В данной цепочке получаются 2 пользовательских преобразования, что запрещено стандартом.
P.S. в обоих случаях есть ещё стандартное преобразование (identity), которое идёт первым. Но это роли не играет.

Комментариев нет:

Отправить комментарий