Этот ответ @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)
Является ли наше предположение в названии правильным? Надеюсь, мы не упустили никаких потенциальных недостатков.