Esta respuesta de @R. Martinho Fernandes muestra que el modismo safe-bool aparentemente está en desuso en C ++ 11, ya que puede ser reemplazado por un simple
explicit operator bool() const;
de acuerdo con la cita estándar en la respuesta §4 [conv] p3:
Una expresión e se puede convertir implícitamente a un tipo
Tsi y solo si la declaraciónT t=e;está bien formada, para alguna variable temporal inventadat(§8.5). Ciertas construcciones de lenguaje requieren que una expresión se convierta en un valor booleano. Una expresióneque aparece en el contexto de un tal se dice que está convertido contextualmente abooly está bien formado, si y sólo si la declaraciónbool t(e);está bien formado , por alguna variable inventado t temporal (§8.5).
La parte resaltada muestra claramente la "conversión explícita implícita" (llamada "conversión contextual" en el estándar) como @R. Martinho lo puso.
Las "ciertas construcciones de lenguaje" que requieren ese "reparto explícito implícito" parecen ser las siguientes:
if,while,for(§6.4 [stmt.select] p4)- operadores lógicos binarios
&&y||(§5.14 [expr.log.and/or] p1para ambos) - el operador de negación lógica
!(§5.3.1 [expr.unary.op] p9) - operador condicional
?:(§5.14 [expr.cond] p1) static_assert(§7 [dcl.dcl] p4)noexcept(§15.4 [except.spec] p2)
¿Es correcta nuestra suposición en el título? Espero que no hayamos pasado por alto posibles inconvenientes.
operator bool. Por ejemplo, si tengo un shared_ptrmiembro llamado p y tengo este método: operator bool() const { return p; }no se compila. Eso es estúpido de la OMI.