C ++ 17 führt das [[nodiscard]]
Attribut ein, mit dem Programmierer Funktionen so kennzeichnen können, dass der Compiler eine Warnung ausgibt, wenn das zurückgegebene Objekt von einem Aufrufer verworfen wird. Das gleiche Attribut kann einem gesamten Klassentyp hinzugefügt werden.
Ich habe im ursprünglichen Vorschlag über die Motivation für dieses Feature gelesen und weiß, dass C ++ 20 das Attribut zu Standardfunktionen wie hinzufügen wird std::vector::empty
, deren Namen keine eindeutige Bedeutung in Bezug auf den Rückgabewert vermitteln.
Es ist eine coole und nützliche Funktion. In der Tat scheint es fast zu nützlich. Überall, wo ich darüber lese [[nodiscard]]
, diskutieren die Leute darüber, als würden Sie es nur einigen ausgewählten Funktionen oder Typen hinzufügen und den Rest vergessen. Aber warum sollte ein nicht verwerfbarer Wert ein Sonderfall sein, insbesondere beim Schreiben von neuem Code? Ist ein verworfener Rückgabewert nicht in der Regel ein Fehler oder zumindest eine Verschwendung von Ressourcen?
Und gehört es nicht zu den Entwurfsprinzipien von C ++, dass der Compiler so viele Fehler wie möglich abfängt?
Wenn ja, warum fügen [[nodiscard]]
Sie dann nicht zu fast jeder einzelnen Nichtfunktion void
und zu fast jeder einzelnen Klassenart Ihren eigenen Code hinzu , der kein Legacy-Code ist ?
Ich habe versucht, das in meinem eigenen Code zu tun, und es funktioniert gut, außer es ist so schrecklich ausführlich, dass es sich wie Java anfühlt. Es erscheint viel natürlicher, Compiler standardmäßig vor verworfenen Rückgabewerten warnen zu lassen , mit Ausnahme der wenigen anderen Fälle, in denen Sie Ihre Absicht markieren [*] .
Da ich in Standardvorschlägen, Blogeinträgen, Stack Overflow-Fragen oder irgendwo anders im Internet keine Diskussionen über diese Möglichkeit gesehen habe, muss mir etwas fehlen.
Warum macht eine solche Mechanik in neuem C ++ - Code keinen Sinn? Ist Ausführlichkeit der einzige Grund, nicht [[nodiscard]]
fast überall zu verwenden?
[*] Theoretisch könnten Sie [[maydiscard]]
stattdessen so etwas wie ein Attribut haben, das auch rückwirkend zu Funktionen wie printf
in Standardbibliotheksimplementierungen hinzugefügt werden kann .
const
können eine ansonsten "einfache" Klasse (oder vielmehr "einfaches altes Datenobjekt") in C ++ erheblich aufblähen lassen .
std::vector
oder std::unique_ptr
, von denen Sie nur Datenelemente in Ihrer Klassendefinition benötigen. Ich habe mit beiden Sprachen gearbeitet; Java ist eine okayische Sprache, aber ausführlicher.
operator =
zum Beispiel. Undstd::map::insert
.