Это, по-видимому, исправлено.
По крайней мере, в N3290 вместо этого void*
преобразование std::basic_ios::operator bool
, и этот operator bool
объявлен explicit
.
Обратите внимание, что C ++ 98 / C ++ 03 не поддерживает explicit
операторы преобразования типов, но C ++ 11 поддерживает.
explicit
оператор преобразования типов
N3290 §12.3.2 / 2;
рассматривается только как определяемое пользователем преобразование для прямой инициализации (8.5)
И этоможет показаться непрактичным для условия , например, в выражении while
или for
.
К счастью,
N3290 §4 /3;
Выражение e
может быть неявно преобразовано в тип T
тогда и только тогда, когда объявление T t=e;
правильно сформировано для некоторой изобретенной временной переменной t
(8.5).Некоторые языковые конструкции требуют преобразования выражения в логическое значение.Выражение e
, появляющееся в таком контексте, называется контекстно преобразованным в bool
и корректно сформировано тогда и только тогда, когда объявление bool t(e);
правильно сформировано для некоторой изобретенной временной переменной.t
(8,5).Эффект любого неявного преобразования аналогичен выполнению объявления и инициализации, а затем использованию временной переменной в качестве результата преобразования.
, где bool t(e);
- это прямая инициализация .
Например, вам не нужно явно преобразовывать объект потока, используемый в качестве условия в while
, потому что существует неявное явное преобразование (хе-хе).
К сожалению,В поисках N3290 я не могу найти ни одного списка «определенных языковых конструкций», где это происходит, но в комментариях к этому ответу JohannesD написал:
Искал в FDIS «контекстуально», и весьсписок выглядит так: if
, while
, do
, for
, noexcept
и static_assert
условий;первый операнд ?:
;оба операнда &&
и ||
;и операнд !
.
Приветствия и hth.,