O idioma safe-bool é obsoleto no C ++ 11?

179

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ção T t=e;for bem formada, para algumas variáveis ​​temporárias inventadas t(§8.5). Certas construções de linguagem exigem que uma expressão seja convertida em um valor booleano. Uma expressão eque aparece em tal contexto um é dito para ser contextualmente convertido para boole é bem formada, se e apenas se a declaração bool 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.

Xeo
fonte
30
+1: Adoro esse tipo de pergunta que me ensina coisas novas sobre o próximo padrão.
Björn Pollex
1
Você sabe que elenco explícito implícito está faltando no padrão ... retornando algo de outro 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.
David
O que você quer dizer com elenco "implícito explícito", @David?
Sz.

Respostas:

128

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.

Cachorro
fonte
-5

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.

Luis Machuca
fonte
34
Eu estava falando puramente na presença de C ++ 11. Essa pergunta nem toca no código antigo, na compatibilidade com versões anteriores ou na falta de vontade de mudar para compiladores compatíveis com C ++ 11. Observe também que o C ++ 11, por si só, não é totalmente compatível com versões anteriores, ele introduziu alterações de última hora.
Xeo
4
Não teria sido capaz de saber disso, desculpe. Não considerei apenas a resposta vinculada no início, mas também o fato de a pergunta estar marcada como [c ++] e [c ++ - faq], o que me levou a pensar que a avaliação dos dois estágios da linguagem era relevante.
Luis Machuca
1
Você certamente está certo, eu não o expliquei explicitamente na questão. Vou editar isso, obrigado pelo aviso.
Xeo
1
Essa resposta pode realmente usar a atualização, agora que ela tem quase dois anos.
Filhote de cachorro
1
Vou ter que desistir de votar devido a desacordo, embora eu compre uma cerveja para você pessoalmente e diga "ei, sem ressentimentos". Mas muitos paradigmas no C ++ 11 estavam passando por uma implantação --std=c++0xmuito 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.
HostileFork diz que não confia em SE