Ответ 1
Условие считается "истинным", если оно оценивается ничем иным, кроме 0 *. ""
представляет собой массив const char, содержащий один символ \0
. Чтобы оценить это как условие, компилятор "распадает" массив на const char*
. Поскольку const char[1]
не расположен по адресу 0, указатель отличен от нуля и условие выполняется.
* Точнее, если он оценивает true
после неявного преобразования в bool
. Для простых типов это означает то же самое, что и ненулевое, но для типов классов вам необходимо определить, существует ли operator bool()
и что он делает.
§ 4.12 из спецификации проекта С++ 11:
4.12 Логические преобразования [conv.bool]
Значение арифметики, неперечисленное перечисление, указатель или указатель на тип члена может быть преобразуется в prvalue типа bool. Нулевое значение, значение нулевого указателя, или значение указателя нулевого элемента преобразуется в значение false; любое другое значение преобразован в true. Значение prdue типа std:: nullptr_t может быть преобразовано к значению типа bool; результирующее значение false.