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 unshared_ptr
miembro llamado p y tengo este método:operator bool() const { return p; }
no se compila. Eso es estúpido de la OMI.Respuestas:
Si. Este es el ejemplo de los problemas con solo tener conversiones implícitas definidas por el usuario y operadores explícitos de conversión definidos por el usuario prácticamente se inventaron debido a este problema y para reemplazar todas las cosas de bool seguro con algo mucho más limpio y más lógico.
fuente
No lo llamaría "obsoleto". Hasta ahora, no todos están dando el salto a C ++ 11 (ni siquiera 1 año ). E incluso si hubiera una buena cantidad de codificadores, la capacidad de mantener el código compatible con versiones anteriores sería imprescindible, teniendo en cuenta que este tipo de lenguaje parece más sensato para las bibliotecas que para los programas propiamente dichos.
fuente
--std=c++0x
mucho antes de que el clavo final se introdujera en el ataúd de estándares y decidieron poner el nombre en la especificación ISO. A menos que sea un adicto a la metaprogramación de plantillas realmente profundo, los detalles de la especificación C ++ 11 frente a lo que la gente estaba usando probablemente no tengan consecuencias para usted ... lo que significa que era anterior a 2011 para casi todos los propósitos prácticos, incluso entonces. Y ahora, para mi reloj, es casi 2015.