Namensräume
Varianten
Aktionen

C++-Attribut: nodiscard (seit C++17)

Von cppreference.com
< cpp‎ | language‎ | attributes
 
 
C++ Sprache
Allgemeine Themen
Kontrollfluss
Bedingte Ausführungsaussagen
if
Iterationsanweisungen (Schleifen)
for
Bereichs-for (C++11)
Sprunganweisungen
Funktionen
Funktionsdeklaration
Lambda-Funktionsausdruck
inline-Spezifizierer
Dynamische Ausnahmespezifikationen (bis C++17*)
noexcept-Spezifizierer (C++11)
Ausnahmen
Namensräume
Typen
Spezifizierer
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Speicherdauer-Spezifizierer
Initialisierung
Ausdrücke
Alternative Darstellungen
Literale
Boolesch - Ganzzahl - Gleitkommazahl
Zeichen - String - nullptr (C++11)
Benutzerdefinierte (C++11)
Dienstprogramme
Attribute (C++11)
Typen
typedef-Deklaration
Typalias-Deklaration (C++11)
Umwandlungen
Speicherzuweisung
Klassen
Klassenspezifische Funktionseigenschaften
explicit (C++11)
static

Spezielle Member-Funktionen
Templates
Sonstiges
 
 
Attribute
(C++23)
(C++11)(bis C++26)
(C++14)
(C++20)
nodiscard
(C++17)
(C++11)
(C++20)
 

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 nodiscard deklarierte Funktion aufgerufen wird, oder
  • eine Funktion, die eine Aufzählung oder Klasse per Wert zurückgibt und mit nodiscard deklariert wurde, aufgerufen wird, oder
  • ein mit nodiscard deklarierter Konstruktor über eine explizite Typumwandlung oder static_cast aufgerufen wird, oder
  • ein Objekt eines Aufzählungs- oder Klassentyps, das mit nodiscard deklariert 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

Standardbibliothek

Die folgenden Standardfunktionen sind mit dem Attribut nodiscard deklariert

Erweiterter Inhalt
Allocationsfunktionen
Allokationsfunktionen
(Funktion) [bearbeiten]
alloziiert uninitialisierten Speicher
(public member function of std::allocator<T>) [bearbeiten]
[static]
alloziiert uninitialisierten Speicher unter Verwendung des Allokators
(public static member function of std::allocator_traits<Alloc>) [bearbeiten]
alloziert Speicher
(public member function of std::pmr::memory_resource) [bearbeiten]
alloziiert Speicher
(public member function of std::pmr::polymorphic_allocator<T>) [bearbeiten]
allokiert uninitialisierten Speicher unter Verwendung des äußeren Allokators
(public member function of std::scoped_allocator_adaptor<OuterAlloc,InnerAlloc...>) [bearbeiten]
Indirekter Zugriff
(C++17)
Zeigeroptimierungsbarriere
(Funktionstemplate) [bearbeiten]
informiert den Compiler, dass ein Zeiger ausgerichtet ist
(Funktions-Template) [edit]
Leere-Prüfungsfunktionen
(C++17)
prüft, ob der Container leer ist
(function template) [bearbeiten]
prüft, ob der Node-Handle leer ist
(public member function of node handle)
prüft, ob der Container leer ist
(public member function of std::array<T,N>) [bearbeiten]
prüft, ob der String leer ist
(public member function of std::basic_string<CharT,Traits,Allocator>) [bearbeiten]
prüft, ob die Ansicht leer ist
(public member function of std::basic_string_view<CharT,Traits>) [bearbeiten]
prüft, ob der Container leer ist
(public member function of std::deque<T,Allocator>) [bearbeiten]
prüft, ob der Container leer ist
(public member function of std::forward_list<T,Allocator>) [bearbeiten]
prüft, ob der Container leer ist
(public member function of std::list<T,Allocator>) [bearbeiten]
prüft, ob der Container leer ist
(public member function of std::map<Key,T,Compare,Allocator>) [bearbeiten]
prüft, ob die Übereinstimmung erfolgreich war
(public member function of std::match_results<BidirIt,Alloc>) [bearbeiten]
prüft, ob der Container leer ist
(public member function of std::multimap<Key,T,Compare,Allocator>) [bearbeiten]
prüft, ob der Container leer ist
(public member function of std::multiset<Key,Compare,Allocator>) [bearbeiten]
prüft, ob der Container-Adapter leer ist
(public member function of std::priority_queue<T,Container,Compare>) [bearbeiten]
prüft, ob der Container-Adapter leer ist
(public member function of std::queue<T,Container>) [bearbeiten]
prüft, ob der Container leer ist
(public member function of std::set<Key,Compare,Allocator>) [bearbeiten]
prüft, ob die Sequenz leer ist
(public member function of std::span<T,Extent>) [bearbeiten]
prüft, ob der Container-Adapter leer ist
(public member function of std::stack<T,Container>) [bearbeiten]
prüft, ob der Container leer ist
(public member function of std::unordered_map<Key,T,Hash,KeyEqual,Allocator>) [bearbeiten]
prüft, ob der Container leer ist
(public member function of std::unordered_multimap<Key,T,Hash,KeyEqual,Allocator>) [bearbeiten]
prüft, ob der Container leer ist
(public member function of std::unordered_multiset<Key,Hash,KeyEqual,Allocator>) [bearbeiten]
prüft, ob der Container leer ist
(public member function of std::unordered_set<Key,Hash,KeyEqual,Allocator>) [bearbeiten]
prüft, ob der Container leer ist
(public member function of std::vector<T,Allocator>) [bearbeiten]
prüft, ob der Pfad leer ist
(public member function of std::filesystem::path) [bearbeiten]
Sonstiges
(C++11)
führt eine Funktion asynchron aus (potenziell in einem neuen Thread) und gibt ein std::future zurück, das das Ergebnis enthalten wird
(Funktionsvorlage) [bearbeiten]
(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

Platzhalter zum Überspringen eines Elements beim Entpacken eines tuple mit tie
(constant) [bearbeiten]
C-Dokumentation für nodiscard