Этот ответ @R. Мартиньо Фернандес показывает, что идиома safe-bool явно устарела в C ++ 11, поскольку ее можно заменить простой
explicit operator bool() const;
в соответствии со стандартной цитатой в ответе §4 [conv] p3
:
Выражение e может быть неявно преобразовано в тип
T
тогда и только тогда, когда объявлениеT t = e;
правильно сформировано, для некоторых придуманных временных переменнаяt
(§8.5). Некоторые языковые конструкции требуют, чтобы выражение было преобразовано в логическое значение. Выражениеe
, появляющееся в таком контексте, называется контекстно преобразованным вbool
и правильно сформировано тогда и только тогда, когда объявление] bool t (e);
правильно сформирован для некоторой придуманной временной переменной t (§8.5).
Выделенная часть ясно показывает «неявное явное приведение» (называемое «контекстным преобразованием» в стандарт) как @R. Мартиньо выразился.
«Определенные языковые конструкции», требующие «неявного явного приведения», выглядят так:
if
, while
, for
( §6.4 [stmt.select] p4
) &&
и ||
( §5.14 [expr.log.and / или] p1
для обоих) !
( §5.3.1 [expr.unary.op] p9
) ?:
( §5.14 [expr.cond] p1
) static_assert
( §7 [dcl.dcl] p4
) noexcept
( §15.4 [except.spec] p2
) Верно ли наше предположение в заголовке? Надеюсь, мы не упустили из виду никаких потенциальных недостатков.