C++ attribute: nodiscard (since C++17)
Wenn eine Funktion, die als
nodiscard
deklariert ist, oder eine Funktion, die eine Enumeration oder Klasse, die als
nodiscard
deklariert ist, by value zurückgibt, aus einem
discarded-value expression
aufgerufen wird, der keine Umwandlung zu
void
ist, wird der Compiler ermutigt, eine Warnung auszugeben.
Inhaltsverzeichnis |
Syntax
[
[
nodiscard
]
]
|
(1) | (seit C++17) | |||||||
[
[
nodiscard
(
string-literal
)
]
]
|
(2) | (seit C++20) | |||||||
| string-literal | - | ein unevaluated string literal , der verwendet werden könnte, um die Begründung darzulegen, warum das Ergebnis nicht verworfen werden sollte |
Erklärung
Erscheint in einer Funktionsdeklaration, Aufzählungsdeklaration oder Klassendeklaration.
Wenn, von einem verworfenen Wertausdruck außer einer Umwandlung nach void ,
-
eine als
nodiscarddeklarierte Funktion aufgerufen wird, oder -
eine Funktion, die eine als
nodiscarddeklarierte Enumeration oder Klasse als Wert zurückgibt, aufgerufen wird, oder -
ein als
nodiscarddeklarierter Konstruktor durch explizite Typumwandlung oder static_cast aufgerufen wird, oder -
ein Objekt eines als
nodiscarddeklarierten Enumeration- oder Klassentyps durch explizite Typumwandlung oder static_cast initialisiert wird,
Der Compiler wird dazu angehalten, eine Warnung auszugeben.
|
Das string-literal , falls angegeben, wird normalerweise in die Warnungen eingeschlossen. |
(since C++20) |
Beispiel
struct [[nodiscard]] error_info { /*...*/ }; error_info enable_missile_safety_mode() { /*...*/ return {}; } void launch_missiles() { /*...*/ } void test_missiles() { enable_missile_safety_mode(); // Compiler kann vor dem Verwerfen eines nodiscard-Werts warnen launch_missiles(); } error_info& foo() { static error_info e; /*...*/ return e; } void f1() { foo(); } // nodiscard-Typ wird nicht als Wert zurückgegeben, keine Warnung // nodiscard( string-literal ) (seit C++20): [[nodiscard("PURE FUN")]] int strategic_value(int x, int y) { return x ^ y; } int main() { strategic_value(4, 2); // Compiler kann vor dem Verwerfen eines nodiscard-Werts warnen auto z = strategic_value(0, 0); // OK: Rückgabewert wird nicht verworfen 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
Standardbibliothek
Die folgenden Standardfunktionen sind mit dem
|
(bis C++26) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| P1771R1 | C++17 |
[[nodiscard]]
bei Konstruktoren hat keine Wirkung
|
kann eine Warnung verursachen, wenn das konstruierte Objekt verworfen wird |
Referenzen
- C++23-Standard (ISO/IEC 14882:2024):
-
- 9.12.9 Nodiscard-Attribut [dcl.attr.nodiscard]
- C++20-Standard (ISO/IEC 14882:2020):
-
- 9.12.8 Nodiscard-Attribut [dcl.attr.nodiscard]
- C++17-Standard (ISO/IEC 14882:2017):
-
- 10.6.7 Nodiscard-Attribut [dcl.attr.nodiscard]
Siehe auch
|
(C++11)
|
Platzhalter zum Überspringen eines Elements beim Auspacken eines
tuple
mittels
tie
(Konstante) |
|
C-Dokumentation
für
nodiscard
|
|