¿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ó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 tal contexto se dice que se convierte contextualmente abool
y está bien formada si y solo si la declaraciónbool 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.
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.
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.
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