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 einshared_ptr
Mitglied namens p habe und diese Methodeoperator bool() const { return p; }
habe:, kann es nicht kompiliert werden. Das ist blöde IMO.Antworten:
Ja. Dies ist das Beispiel für Probleme, bei denen nur implizite benutzerdefinierte Konvertierungen und explizite benutzerdefinierte Konvertierungsoperatoren aufgrund dieses Problems praktisch erfunden wurden , um alle Safe-Bool-Inhalte durch etwas viel saubereres und logischeres zu ersetzen.
quelle
Ich würde es nicht "veraltet" nennen. Noch macht nicht jeder den Sprung zu C ++ 11 (noch nicht einmal 1 Jahr alt). Und selbst wenn es eine gute Anzahl von Codierern gäbe, wäre die Fähigkeit, den Code abwärtskompatibel zu halten, ein Muss, wenn man bedenkt, dass diese Art von Redewendung für Bibliotheken sinnvoller erscheint als für eigentliche Programme.
quelle
--std=c++0x
lange bevor der letzte Nagel in den Standardsarg getrieben wurde, und sie beschlossen, den Namen in die ISO-Spezifikation aufzunehmen. Wenn Sie kein wirklich tiefgründiger Junkie mit Metaprogrammierung für Vorlagen sind, haben die Details der C ++ 11-Spezifikation im Vergleich zu den von Ihnen verwendeten wahrscheinlich keine Konsequenz für Sie ... was bedeutet, dass sie für fast alle praktischen Zwecke schon damals älter als 2011 war. Und jetzt, nach meiner Uhr, ist es fast 2015.