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
Tse, 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ãoeque aparece em tal contexto um é dito para ser contextualmente convertido paraboole é 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] p1para 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_ptrmembro chamado p e tiver este método operator bool() const { return p; }:, ele não será compilado. Isso é IMO estúpido.