2011-06-05 17 views
160

This answer of @R. Martinho Fernandes muestra, que el idioma segura-bool está en desuso Apperently en C++ 11, ya que puede ser sustituido por un simple¿Es el lenguaje seguro booleano obsoleto en C++ 11?

explicit operator bool() const; 

de acuerdo con la cita estándar en la respuesta §4 [conv] p3:

Una expresión e puede convertirse implícitamente en un tipo T si 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 e que aparece en tal contexto se dice que es contextualmente convertidos-bool y está bien formado si y sólo si la declaración bool t(e); está bien formado, por alguna inventaron t variable temporal (§8.5).

La parte resaltada muestra claramente el "molde explícito implícito" (llamado "conversión contextual" en el estándar) como @R. Martinho lo dijo.

Los "ciertas construcciones del lenguaje" que requieren que "conversión explícita implícita" parecen ser los siguientes:

  • if, while, for (§6.4 [stmt.select] p4)
  • operadores binarios lógicos && y || (§5.14 [expr.log.and/or] p1 de 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 hayamos pasado por alto los posibles inconvenientes.

+27

+1: Me encanta este tipo de pregunta que me enseña cosas nuevas sobre el próximo estándar. –

+0

Sabes qué molde implícito explícito falta en el estándar ... devolviendo algo de otro 'operador bool'. Por ejemplo, si tengo un miembro 'shared_ptr' llamado p y tengo este método:' operator bool() const {return p; } ', no se puede compilar. Eso es estúpido IMO. – David

Respuesta

115

Sí. Esto es el ejemplo por problemas con solo tener conversiones implícitas definidas por el usuario y operadores explícitos de conversión definidos por el usuario eran prácticamente invented because of this problem y para reemplazar todas las cosas del bool seguro con algo mucho más limpio y más lógico.

1

No lo llamaría "obsoleto". No todos están dando el salto a C++ 11 (ni siquiera 1 año anterior) hasta el momento. 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 expresiones idiomáticas parece más sensato para las bibliotecas que para los programas propiamente dichos.

+28

Estaba hablando puramente en presencia de C++ 11.Esta pregunta no toca el código antiguo, la compatibilidad hacia atrás o la falta de voluntad para cambiar a compiladores conscientes de C++ 11. También tenga en cuenta que C++ 11 en sí mismo no es completamente compatible con versiones anteriores, sino que introdujo cambios de última hora. – Xeo

+3

No habría 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. –

+1

Sin duda tiene razón, no lo mencioné explícitamente en la pregunta. Voy a editar eso, gracias por el aviso. – Xeo