Namespaces
Variants

C++ attribute: nodiscard (since C++17)

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

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 nodiscard deklarierte Funktion aufgerufen wird, oder
  • eine Funktion, die eine als nodiscard deklarierte Enumeration oder Klasse als Wert zurückgibt, aufgerufen wird, oder
  • ein als nodiscard deklarierter Konstruktor durch explizite Typumwandlung oder static_cast aufgerufen wird, oder
  • ein Objekt eines als nodiscard deklarierten 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 nodiscard -Attribut deklariert:

Erweiterter Inhalt
Allokationsfunktionen
Allokierungsfunktionen
(Funktion)
reserviert nicht initialisierten Speicher
(öffentliche Elementfunktion von std::allocator<T> )
[static]
reserviert nicht initialisierten Speicher mit dem Allokator
(öffentliche statische Memberfunktion von std::allocator_traits<Alloc> )
weist Speicher zu
(öffentliche Elementfunktion von std::pmr::memory_resource )
Speicher allozieren
(öffentliche Elementfunktion von std::pmr::polymorphic_allocator<T> )
weist nicht initialisierten Speicher unter Verwendung des äußeren Allokators zu
(öffentliche Elementfunktion von std::scoped_allocator_adaptor<OuterAlloc,InnerAlloc...> )
Indirekter Zugriff
(C++17)
Zeigeroptimierungsbarriere
(Funktions-Template)
informiert den Compiler, dass ein Zeiger ausgerichtet ist
(Funktions-Template)
Prüffunktionen für Leerheit
(C++17)
prüft, ob der Container leer ist
(Funktions-Template)
prüft, ob der Node Handle leer ist
(öffentliche Elementfunktion von node handle )
prüft, ob der Container leer ist
(öffentliche Elementfunktion von std::array<T,N> )
prüft, ob der String leer ist
(öffentliche Elementfunktion von std::basic_string<CharT,Traits,Allocator> )
prüft, ob die Ansicht leer ist
(öffentliche Elementfunktion von std::basic_string_view<CharT,Traits> )
prüft, ob der Container leer ist
(öffentliche Elementfunktion von std::deque<T,Allocator> )
prüft, ob der Container leer ist
(öffentliche Elementfunktion von std::forward_list<T,Allocator> )
prüft, ob der Container leer ist
(öffentliche Elementfunktion von std::list<T,Allocator> )
prüft, ob der Container leer ist
(öffentliche Elementfunktion von std::map<Key,T,Compare,Allocator> )
prüft, ob die Übereinstimmung erfolgreich war
(öffentliche Elementfunktion von std::match_results<BidirIt,Alloc> )
prüft, ob der Container leer ist
(öffentliche Elementfunktion von std::multimap<Key,T,Compare,Allocator> )
prüft, ob der Container leer ist
(öffentliche Elementfunktion von std::multiset<Key,Compare,Allocator> )
prüft, ob der Container-Adapter leer ist
(öffentliche Elementfunktion von std::priority_queue<T,Container,Compare> )
prüft, ob der Container-Adapter leer ist
(öffentliche Elementfunktion von std::queue<T,Container> )
prüft, ob der Container leer ist
(öffentliche Elementfunktion von std::set<Key,Compare,Allocator> )
prüft, ob die Sequenz leer ist
(öffentliche Elementfunktion von std::span<T,Extent> )
prüft, ob der Container-Adapter leer ist
(öffentliche Elementfunktion von std::stack<T,Container> )
prüft, ob der Container leer ist
(öffentliche Elementfunktion von std::unordered_map<Key,T,Hash,KeyEqual,Allocator> )
prüft, ob der Container leer ist
(öffentliche Elementfunktion von std::unordered_multimap<Key,T,Hash,KeyEqual,Allocator> )
prüft, ob der Container leer ist
(öffentliche Elementfunktion von std::unordered_multiset<Key,Hash,KeyEqual,Allocator> )
prüft, ob der Container leer ist
(öffentliche Elementfunktion von std::unordered_set<Key,Hash,KeyEqual,Allocator> )
prüft, ob der Container leer ist
(öffentliche Elementfunktion von std::vector<T,Allocator> )
prüft, ob der Pfad leer ist
(öffentliche Elementfunktion von std::filesystem::path )
Sonstiges
(C++11)
führt eine Funktion asynchron aus (möglicherweise in einem neuen Thread) und gibt ein std::future zurück, das das Ergebnis enthalten wird
(Funktions-Template)
(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