подскажите пожалуйста, как в компилятор С++ разрешает проблему неявного привидения типов. В частности интересует вопрос: почему в первом случае компилятор сможет построить цепочку преобразований, а во втором нет? Или подскажите где можно об этом почитать.
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), которое идёт первым. Но это роли не играет.
Если я вас правильно понял, вы хотите узнать почему в if
String
не привелся к String2
, который может приводится к bool
? Если так, то: компилятор не может знать, что вы хотите (чтобы String
привелся к String2
), для этого нужно явно это указать. К примеру у вас может быть оператор приведения к String3
, который тоже приводится к bool
- какой тогда компилятору выбирать? Почему работает первый вариант: потому что в if
явно требуется преобразование к bool
(который является по сути числовым типом, как, например int
).
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Собственно вопрос в том, как реализовать код который из string будет выбирать только ту часть, что удовлетворяет условиям, а всё остальное удалятьВ...
Решил проверить срабатывание isInterrupted() следующим кодом:
Все страницы отображаются нормально, только в одной отображается все кроме текста добавления который подтягивается с базы и отображения...