24>Скорее всего, потому что char* -> bool — "встроенное" преобразование, а char* -> std::string — пользовательское.
Если говорить в терминах, то char* в bool — это так называемое boolean conversion (4.12), а char* в std::string — вызов пользовательского преобразования, conversion by constructor. У первого приоритет выше.
Здравствуйте, Vamp, Вы писали:
Ytz>>Очевидно, что раз в C нет bool, то и приведения к нему быть не может Правило простое: Ytz>>0 — false >>0 — true
V>Только ты в этом простом правиле ошибку сделал. !0 — true, а не >0. V>Кстати, в до-bool времена многие зачем-то (никогда не понимал, кстати) делали так:
V>
V>#define TRUE 1;
V>#define FALSE 0;
V>
V>Так вот это неправильно. Правильно так:
Тоже неправильно. Тогда уж так:
Здравствуйте, Ytz, Вы писали:
Ytz>Это ты говоришь о стандарте C99 в котором появился bool, но писать if (p) в C можно было всегда — это классика. Некоторые даже так извращались:
Ytz>Или как тебе классический K&R:
Ytz>
Ytz>while (*dst++ = *src++);
Ytz>
а, тебя интересует почему в c++ if принимает bool?
ну, во-первых это логично. во-вторых чтобы можно было использовать пользовательские типы в if.
Здравствуйте, Vamp, Вы писали:
Ytz>>Очевидно, что раз в C нет bool, то и приведения к нему быть не может Правило простое: Ytz>>0 — false >>0 — true
V>Только ты в этом простом правиле ошибку сделал. !0 — true, а не >0. V>Кстати, в до-bool времена многие зачем-то (никогда не понимал, кстати) делали так:
V>
Здравствуйте, Ytz, Вы писали:
Ytz>Лучше разобраться помоги, если знаешь
Пока что я не улавливаю в чём именно ты хочешь разобраться.
IMHO, ты просто прикалываешься...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, баг, Вы писали:
баг>Здравствуйте, Vamp, Вы писали:
Ytz>>>Очевидно, что раз в C нет bool, то и приведения к нему быть не может Правило простое: Ytz>>>0 — false >>>0 — true
V>>Только ты в этом простом правиле ошибку сделал. !0 — true, а не >0. V>>Кстати, в до-bool времена многие зачем-то (никогда не понимал, кстати) делали так:
V>>
V>>#define TRUE 1;
V>>#define FALSE 0;
V>>
V>>Так вот это неправильно. Правильно так: баг>Тоже неправильно. Тогда уж так: баг>
скобки в этом макросе ради чистоты или можете показать когда без них нарушится порядок ?
я хотел поставить сначала но посмотрев таблицу операторов передумал
Здравствуйте, Ytz, Вы писали:
Ytz>>>А зачем сделали такое неявное приведение? 24>>char* к bool? К bool многое приводится неявно, например чтоб писать if (p) вместо if (p != NULL) Ytz>В С нет bool, но написать if (p) можно
Видимо для единообразия. В С внутри условий ведь ноль воспринимается как ложь, всё остальное — как истина, т.е. есть некоторое подобие булевого типа, который нельзя явно записать. А в С++ раз уж bool есть, то логично, что if, while и прочее, где нужно логическое выражение, принимает именно bool, а не что угодно. Следовательно всё остальное к нему должно приводиться по аналогичныим правилам, как в С. И раз оно приводится к bool внутри условий, то должно приводится и снаружи. Хотя как по мне, то эти неявные приведения только добавляют путаницы, и я всегда пишу полностью if (p != NULL).
Здравствуйте, 24, Вы писали:
24>Следовательно всё остальное к нему должно приводиться по аналогичныим правилам, как в С.
Занятно. Значит, VC отсебятину лепит с предупреждениями? http://codepad.org/neVNoRpu
Здравствуйте, Roman Odaisky, Вы писали:
баг>>>#define TRUE (!FALSE) J>>скобки в этом макросе ради чистоты или можете показать когда без них нарушится порядок ?
RO>TRUE[s], оно же s[1]
да этого то я и не заметил
и ведь знаю же эту конструкцию но ...
еще раз убедился что надо все тщательно проверять чем что то заключать
спасибо за пример
Здравствуйте, Vamp, Вы писали:
RO>>TRUE[s], оно же s[1] V>А в чем разница? Что со скобками, что без — компилируется все равно, хотя и не должно.
если без скобочек то
тут отрицание применяется к элементу мнимого массива
TRUE[s]
а тут к индексу
s[TRUE]
просто без скобочек меняется логика
а почему не должно ?
J>а почему не должно ?
А какой в этом коде смысл? Не забудь, TRUE и FALSE — аналог булевых значений. Сравни с конструкцией true[s] в С++ — какой в ней смысл? Хотя тоже компилируется, надо понимать потому, что bool неявно приводится к int.
Здравствуйте, Vamp, Вы писали:
J>>а почему не должно ? V>А какой в этом коде смысл? Не забудь, TRUE и FALSE — аналог булевых значений. Сравни с конструкцией true[s] в С++ — какой в ней смысл? Хотя тоже компилируется, надо понимать потому, что bool неявно приводится к int.
да понятно что код бредовый
но все таки это обман семантики TRUE[s]
никак не ожидаеш что к элементу будет применено отрицание
да и потом это к си тоже относится а там
какой нить ум может запросто применить TRUE
как индекс со значением 1 а получит черти что
Потому что char* — это указатель — это адрес, а адрес — это число, раньше bool не было — были числа — а неравенство числа нулю так и пишется. Позже пояивлся bool — число, false = 0, true!=0.