C++-Attribut: nodiscard (seit C++17)
Wenn eine Funktion, die mit nodiscard deklariert wurde, oder eine Funktion, die eine Aufzählung oder Klasse per Wert zurückgibt und mit nodiscard deklariert wurde, in einem Discarded-Value-Ausdruck außer einem Cast nach void aufgerufen wird, wird der Compiler ermutigt, eine Warnung auszugeben.
Inhalt |
[bearbeiten] Syntax
[[nodiscard]]
|
(1) | (seit C++17) | |||||||
[[nodiscard( string-literal )]] |
(2) | (seit C++20) | |||||||
| string-literal | - | ein unevaluierter String-Literal, der verwendet werden könnte, um die Begründung dafür zu erklären, warum das Ergebnis nicht verworfen werden sollte |
[bearbeiten] Erklärung
Erscheint in einer Funktionsdeklaration, Aufzählungsdeklaration oder Klassendeklaration.
Wenn aus einem Discarded-Value-Ausdruck außer einem Cast nach void,
- eine mit
nodiscarddeklarierte Funktion aufgerufen wird, oder - eine Funktion, die eine Aufzählung oder Klasse per Wert zurückgibt und mit
nodiscarddeklariert wurde, aufgerufen wird, oder - ein mit
nodiscarddeklarierter Konstruktor über eine explizite Typumwandlung oder static_cast aufgerufen wird, oder - ein Objekt eines Aufzählungs- oder Klassentyps, das mit
nodiscarddeklariert wurde, über eine explizite Typumwandlung oder static_cast initialisiert wird,
wird der Compiler ermutigt, eine Warnung auszugeben.
|
Der string-literal, falls angegeben, wird üblicherweise in die Warnungen aufgenommen. |
(seit C++20) |
[bearbeiten] Beispiel
struct [[nodiscard]] error_info { /*...*/ }; error_info enable_missile_safety_mode() { /*...*/ return {}; } void launch_missiles() { /*...*/ } void test_missiles() { enable_missile_safety_mode(); // compiler may warn on discarding a nodiscard value launch_missiles(); } error_info& foo() { static error_info e; /*...*/ return e; } void f1() { foo(); } // nodiscard type is not returned by value, no warning // nodiscard( string-literal ) (since C++20): [[nodiscard("PURE FUN")]] int strategic_value(int x, int y) { return x ^ y; } int main() { strategic_value(4, 2); // compiler may warn on discarding a nodiscard value auto z = strategic_value(0, 0); // OK: return value is not discarded return z; }
Mögliche Ausgabe
game.cpp:5:4: warning: ignoring return value of function declared with ⮠ 'nodiscard' attribute game.cpp:17:5: warning: ignoring return value of function declared with ⮠ 'nodiscard' attribute: PURE FUN
StandardbibliothekDie folgenden Standardfunktionen sind mit dem Attribut
|
(bis C++26) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
[bearbeiten] Defect reports
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| P1771R1 | C++17 | [[nodiscard]] bei Konstruktoren hat keine Auswirkung |
kann eine Warnung verursachen, wenn das erzeugte Objekt verworfen wird |
[bearbeiten] Referenzen
- C++23 Standard (ISO/IEC 14882:2024)
- 9.12.9 Nodiscard attribute [dcl.attr.nodiscard]
- C++20 Standard (ISO/IEC 14882:2020)
- 9.12.8 Nodiscard attribute [dcl.attr.nodiscard]
- C++17 Standard (ISO/IEC 14882:2017)
- 10.6.7 Nodiscard attribute [dcl.attr.nodiscard]
[bearbeiten] Siehe auch
| (C++11) |
Platzhalter zum Überspringen eines Elements beim Entpacken eines tuple mit tie(constant) |
| C-Dokumentation für nodiscard
| |