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,
Twenn die DeklarationT t=e;wohlgeformt istt(§8.5). Bestimmte Sprachkonstrukte erfordern, dass ein Ausdruck in einen Booleschen Wert konvertiert wird. Ein Ausdruckein einem solchen Kontext erscheint gesagt werden kontextuell umgewandelt zuboolund 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] p1fü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_ptrMitglied namens p habe und diese Methode operator bool() const { return p; }habe:, kann es nicht kompiliert werden. Das ist blöde IMO.