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 umshared_ptr
membro chamado p e tiver este métodooperator bool() const { return p; }
:, ele não será compilado. Isso é IMO estúpido.Respostas:
Sim. Este é o exemplo de problemas em ter apenas conversões implícitas definidas pelo usuário e operadores explícitos de conversão definidos pelo usuário praticamente foram inventados por causa desse problema e substituir todo o material do safe-bool por algo muito mais limpo e lógico.
fonte
Eu não chamaria isso de "obsoleto". Nem todo mundo está dando o salto para o C ++ 11 (nem um ano ) até o momento. E mesmo que houvesse uma boa quantidade de codificadores, a capacidade de manter o código compatível com versões anteriores seria obrigatória, considerando que esse tipo de idioma parece mais sensato para as bibliotecas do que para os programas propriamente ditos.
fonte
--std=c++0x
muito antes de o prego final ser introduzido no caixão dos padrões e eles decidiram colocar o nome na especificação ISO. A menos que você seja um viciado em metaprogramação de modelos, os detalhes das especificações do C ++ 11 e do que as pessoas estavam usando provavelmente não têm importância para você ... o que significa que era mais antigo que 2011 para quase todos os fins práticos. E agora, pelo meu relógio, é quase 2015.