Questa risposta di @R. Martinho Fernandes mostra che il linguaggio del bool di sicurezza è apparentemente deprecato in C ++ 11, in quanto può essere sostituito da un semplice
explicit operator bool() const;
secondo la citazione standard nella risposta §4 [conv] p3
:
Un'espressione e può essere implicitamente convertita in un tipo
T
se e solo se la dichiarazioneT t=e;
è ben formata, per alcune variabili temporanee inventatet
(§8.5). Alcuni costrutti del linguaggio richiedono che un'espressione sia convertita in un valore booleano. Sie
dice che un'espressione che appare in un tale contesto sia convertita contestualmente inbool
ed è ben formata se e solo se la dichiarazionebool t(e);
è ben formata , per alcune variabili temporanee inventate t (§8.5).
La parte evidenziata mostra chiaramente il "cast esplicito implicito" (chiamato "conversione contestuale" nello standard) come @R. Martinho l'ha detto.
I "certi costrutti di linguaggio" che richiedono che "cast esplicito implicito" sembrano essere i seguenti:
if
,while
,for
(§6.4 [stmt.select] p4
)- operatori logici binari
&&
e||
(§5.14 [expr.log.and/or] p1
per entrambi) - l'operatore di negazione logica
!
(§5.3.1 [expr.unary.op] p9
) - operatore condizionale
?:
(§5.14 [expr.cond] p1
) static_assert
(§7 [dcl.dcl] p4
)noexcept
(§15.4 [except.spec] p2
)
La nostra assunzione nel titolo è corretta? Spero di non aver trascurato alcun potenziale svantaggio.
operator bool
. Ad esempio, se ho un shared_ptr
membro chiamato p e ho questo metodo operator bool() const { return p; }
:, non riesce a compilare. È stupido IMO.