Этот ответ @R. Martinho Fernandes показывает, что идиома safe-bool явно устарела в С++ 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/or] 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
)
Является ли наше предположение в названии правильным? Надеюсь, мы не упустили никаких потенциальных недостатков.