Ist die Safe-Bool-Sprache in C ++ 11 veraltet?

179

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 Deklaration T t=e;wohlgeformt ist t(§8.5). Bestimmte Sprachkonstrukte erfordern, dass ein Ausdruck in einen Booleschen Wert konvertiert wird. Ein Ausdruck ein einem solchen Kontext erscheint gesagt werden kontextuell umgewandelt zu boolund wohlgeformt ist, wenn und nur wenn die Erklärung bool 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.

Xeo
quelle
30
+1: Ich liebe diese Art von Frage, die mir neue Dinge über den bevorstehenden Standard beibringt.
Björn Pollex
1
Sie wissen, welche implizite explizite Besetzung im Standard fehlt ... und etwas von einem anderen zurückgeben 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.
David
Was meinst du mit "implizit expliziter" Besetzung, @David?
Gr.

Antworten:

128

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.

Hündchen
quelle
-5

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.

Luis Machuca
quelle
34
Ich habe nur in Gegenwart von C ++ 11 gesprochen. Diese Frage berührt weder alten Code noch die Abwärtskompatibilität oder die mangelnde Bereitschaft, auf C ++ 11-fähige Compiler umzusteigen. Beachten Sie auch, dass C ++ 11 an sich nicht vollständig abwärtskompatibel ist, sondern wichtige Änderungen eingeführt hat.
Xeo
4
Hätte das nicht wissen können, sorry. Ich habe nicht nur die am Anfang verlinkte Antwort berücksichtigt, sondern auch die Tatsache, dass die Frage mit [c ++] und [c ++ - faq] gekennzeichnet ist, was mich zu der Annahme veranlasste, dass die Bewertung beider Stufen der Sprache relevant war.
Luis Machuca
1
Sie haben sicherlich Recht, ich habe es in der Frage nicht explizit angegeben. Ich werde das bearbeiten, danke für das Heads-up.
Xeo
1
Diese Antwort könnte wirklich aktualisiert werden, da sie fast zwei Jahre alt ist.
Welpe
1
Ich muss wegen Meinungsverschiedenheiten abstimmen, obwohl ich dir persönlich ein Bier kaufen und sagen würde "Hey, keine harten Gefühle". Viele Paradigmen in C ++ 11 erlebten jedoch bereits --std=c++0xlange 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.
HostileFork sagt, vertraue SE