Esta resposta de @R. Martinho Fernandes mostra que o idioma safe-bool é obsoleto em C ++ 11, pois pode ser substituído por um simples
explicit operator bool() const;
de acordo com a citação padrão na resposta §4 [conv] p3
:
Uma expressão e pode ser implicitamente convertida em um tipo
T
se, e somente se, a declaraçãoT t=e;
for bem formada, para algumas variáveis temporárias inventadast
(§8.5). Certas construções de linguagem exigem que uma expressão seja convertida em um valor booleano. Uma expressãoe
que aparece em tal contexto um é dito para ser contextualmente convertido parabool
e é bem formada, se e apenas se a declaraçãobool t(e);
é bem formada , para alguns inventado t variável temporária (§8.5).
A parte destacada mostra claramente o "elenco explícito implícito" (chamado "conversão contextual" no padrão) como @R. Martinho colocou.
As "certas construções de linguagem" que exigem que "conversão explícita implícita" pareçam ser as seguintes:
if
,while
,for
(§6.4 [stmt.select] p4
)- operadores lógicos binários
&&
e||
(§5.14 [expr.log.and/or] p1
para ambos) - o operador de negação 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
)
Nossa suposição no título está correta? Espero que não tenhamos esquecido quaisquer possíveis desvantagens.
operator bool
. Por exemplo, se eu tiver um shared_ptr
membro chamado p e tiver este método operator bool() const { return p; }
:, ele não será compilado. Isso é IMO estúpido.