¿El idioma de Safe-Bool está obsoleto en C ++ 11?

179

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ón T t=e;está bien formada, para alguna variable temporal inventada t(§8.5). Ciertas construcciones de lenguaje requieren que una expresión se convierta en un valor booleano. Una expresión eque aparece en el contexto de un tal se dice que está convertido contextualmente a booly está bien formado, si y sólo si la declaración bool 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.

Xeo
fuente
30
+1: Me encanta este tipo de preguntas que me enseñan cosas nuevas sobre el próximo estándar.
Björn Pollex
1
Usted sabe qué conversión explícita implícita falta en el estándar ... devolver algo de otro 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.
David
¿Qué quieres decir con elenco "implícito explícito", @David?
Sz.

Respuestas:

128

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.

Perrito
fuente
-5

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.

Luis Machuca
fuente
34
Estaba hablando puramente en presencia de C ++ 11. Esta pregunta no toca el código antiguo, la compatibilidad con versiones anteriores o la falta de voluntad para cambiar a compiladores compatibles con C ++ 11. También tenga en cuenta que C ++ 11 en sí mismo no es totalmente compatible con versiones anteriores, introdujo cambios importantes.
Xeo
44
No hubiera podido saber eso, lo siento. No consideré solo la respuesta vinculada al principio, sino también el hecho de que la pregunta está etiquetada [c ++] y [c ++ - faq], lo que me llevó a pensar que la evaluación de ambas etapas del lenguaje era relevante.
Luis Machuca
1
Sin embargo, tienes razón, no lo dije explícitamente en la pregunta. Lo editaré, gracias por el aviso.
Xeo
1
Esta respuesta realmente podría usar la actualización, ahora que tiene casi dos años.
Puppy
1
Voy a tener que votar en contra debido al desacuerdo, aunque te compraría una cerveza en persona y diría "oye, no hay resentimientos" Pero muchos paradigmas en C ++ 11 estaban experimentando un despliegue ya que --std=c++0xmucho 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.
HostileFork dice que no confíes en SE