¿Está obsoleto el lenguaje safe-bool en C++11?


Esta respuesta de @R. Martinho Fernandes muestra, que el lenguaje safe-bool está aparentemente obsoleto en C++11, ya que puede ser reemplazado por un simple{[26]]}

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ón T 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ón e que aparece en tal contexto se dice que se convierte contextualmente a bool y está bien formada si y solo si la declaración bool t(e); está bien formada, para alguna variable temporal inventada t (§8.5).

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

Los "ciertos constructos del lenguaje" que requieren que " implicit explicit cast" parece ser lo siguiente:

  • 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 ningún inconveniente potencial.

Author: Community, 2011-06-05

2 answers

Sí. Este es el ejemplo para problemas con solo tener conversiones implícitas definidas por el usuario y operadores de conversión explícitos definidos por el usuario fueron prácticamente inventados debido a este problema y para reemplazar todo el material safe-bool con algo mucho más limpio y más lógico.

 120
Author: Puppy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-05 12:12:26

Yo no lo llamaría "obsoleto". No todo el mundo está dando el salto a C++11 (ni siquiera 1 año de edad) hasta ahora. E incluso si una buena cantidad de codificadores lo fueran, la capacidad de mantener el código compatible con versiones anteriores sería una necesidad, teniendo en cuenta que este tipo de lenguaje parece más sensato para las bibliotecas que para los programas propiamente dichos.

 1
Author: Luis Machuca,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-18 19:32:08