Esta respuesta de @R. Martinho Fernandes muestra, que la caja fuerte-bool modismo es el apperently en desuso en C++11, como puede ser sustituido por un simple

explicit operator bool() const;

de acuerdo a la norma cita en la respuesta §4 [conv] p3:

Una expresión de e se puede convertir implícitamente un tipo T si y sólo si la declaración T t=e; está bien formado, para algunos inventado variable temporal t (artículo 8.5). Ciertas construcciones del lenguaje requieren que una expresión se convierte en un valor Booleano. Una expresión e que aparecen en este contexto se dice que contextualmente convertido a bool y está bien formado si y sólo si la declaración bool t(e); está bien formado, para algunos inventado variable temporal t (artículo 8.5).

La parte resaltada muestra claramente la «implícita conversión explícita» (llamado «contextual de conversión» en el estándar) como @R. Martinho ponerlo.

La «ciertas construcciones de lenguaje» que requieren que «implícito explícito del elenco» parecen ser los siguientes:

  • if, while, for (§6.4 [stmt.select] p4)
  • binario operadores lógicos && 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 nuestra hipótesis en el título correcto? Espero que no nos dan ninguna desventajas potenciales.

  • +1: me encanta este tipo de pregunta a la que me enseña cosas nuevas sobre el próximo estándar.
  • Usted sabe lo implícito explícito echado en falta en la norma… de devolver algo de otro operator bool. Por ejemplo, si tengo un shared_ptr miembro de la llamada p y tiene este método: operator bool() const { return p; }, se produce un error de compilación. Eso es una estupidez de la OMI.
InformationsquelleAutor Xeo | 2011-06-05

2 Comentarios

  1. 123

    Sí. Este es el ejemplo para problemas con sólo tener implícito definido por el usuario y conversiones explícitas definidas por el usuario operadores de conversión fueron prácticamente inventado, porque de este problema y reemplazar todos los seguros-bool cosas con algo mucho más limpia y más lógico.

  2. -2

    Yo no lo llamaría «obsoleto». No todo el mundo es de dar el salto a C++11 (ni siquiera 1 año de edad) hasta el momento. E incluso si la cantidad de un bien de codificadores fueron, la capacidad para mantener el código compatible sería un deber, considerando este tipo de lenguaje se parece más sensato para las bibliotecas que para los programas adecuados.

    • Yo era puramente hablar en la presencia de C++11. Esta pregunta ni toca viejo código, compatibilidad con versiones anteriores, o la falta de voluntad para cambiar a la de C++11 consciente de los compiladores. También tenga en cuenta que C++11 en sí mismo no es totalmente compatible hacia atrás, se introdujeron cambios importantes.
    • No habría sido capaz de saber eso, lo siento. Yo no considerar sólo la respuesta vinculado al principio, pero también el hecho de que la pregunta está etiquetada [c++] y [c++-faq], que me llevó a pensar que la evaluación de la por tanto etapas de la lengua era relevante.
    • Estás en lo cierto, sin embargo, yo no explícitamente en la pregunta. Voy a editar que en el, gracias por el aviso.
    • Esta respuesta podría realmente utilizar la actualización, ahora que es casi dos años de edad.
    • Voy a tener que downvote debido al desacuerdo, aunque me gustaría comprar una cerveza en persona y decir: «hey sin resentimientos». Pero muchos de los paradigmas en C++11 estaban experimentando implementación como --std=c++0x mucho antes de que el final de la uña se clava en las normas ataúd y decidieron poner el nombre de la ISO spec. A menos que seas una gran plantilla de metaprogramación drogadicto, los detalles de C++11 spec vs lo que la gente estaba usando es probable de que no tiene ninguna consecuencia para usted…lo que significa que era mayor que la de 2011 para casi todos los propósitos prácticos, incluso entonces. Y ahora, por mi reloj, que es casi el 2015.
    • Estoy interesado. Lo que tendría que ser actualizada acerca de la respuesta? Aunque C++11 ya está siendo considerado por algunas personas como «viejo», C++03 parece ser todavía el modo por defecto el compilador por defecto para el «default» distros que he visto en cualquier sistema de producción. El seguro-bool lenguaje, que no fallan con C++03, todavía no va a fallar por ellos, y no va a fallar con los nuevos modos de operación. El lenguaje en sí no sería obsoleto. En la mayoría, su expresión se oculta.
    • ¿Por qué se compila con el compilador por defecto para el valor predeterminado distro para que producción? Instalar uno mejor para tu dev máquinas.

Dejar respuesta

Please enter your comment!
Please enter your name here