Diese Antwort von @R. Martinho Fernandes zeigt, dass die Safe-Bool-Sprache in C ++ 11 anscheinend veraltet ist, da sie durch eine einfache ersetzt werden kann
explicit operator bool() const;
gemäß dem Standardzitat in der Antwort §4 [conv] p3
:
Ein Ausdruck e kann für eine erfundene temporäre Variable genau dann implizit in einen Typ konvertiert werden,
T
wenn die DeklarationT t=e;
wohlgeformt istt
(§8.5). Bestimmte Sprachkonstrukte erfordern, dass ein Ausdruck in einen Booleschen Wert konvertiert wird. Ein Ausdrucke
in einem solchen Kontext erscheint gesagt werden kontextuell umgewandelt zubool
und wohlgeformt ist, wenn und nur wenn die Erklärungbool t(e);
wohlgeformt ist , für einige erfundene temporäre Variable t (§8.5).
Der hervorgehobene Teil zeigt deutlich die "implizite explizite Besetzung" (im Standard als "Kontextkonvertierung" bezeichnet) als @R. Martinho hat es ausgedrückt.
Die "bestimmten Sprachkonstrukte", die diese "implizite explizite Besetzung" erfordern, scheinen die folgenden zu sein:
if
,while
,for
(§6.4 [stmt.select] p4
)- binäre logische Operatoren
&&
und||
(§5.14 [expr.log.and/or] p1
für beide) - der logische Negationsoperator
!
(§5.3.1 [expr.unary.op] p9
) - bedingter Operator
?:
(§5.14 [expr.cond] p1
) static_assert
(§7 [dcl.dcl] p4
)noexcept
(§15.4 [except.spec] p2
)
Ist unsere Annahme im Titel richtig? Ich hoffe, wir haben keine möglichen Nachteile übersehen.
operator bool
. Wenn ich zum Beispiel ein shared_ptr
Mitglied namens p habe und diese Methode operator bool() const { return p; }
habe:, kann es nicht kompiliert werden. Das ist blöde IMO.