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
T
si 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óne
que aparece en el contexto de un tal se dice que está convertido contextualmente abool
y 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] p1
para 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_ptr
miembro llamado p y tengo este método: operator bool() const { return p; }
no se compila. Eso es estúpido de la OMI.