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

Si une fonction déclarée nodiscard ou une fonction retournant une énumération ou une classe déclarée nodiscard par valeur est appelée depuis une expression à valeur ignorée autre qu'un cast vers void , il est recommandé que le compilateur émette un avertissement.

Table des matières

Syntaxe

[ [ nodiscard ] ] (1) (depuis C++17)
[ [ nodiscard ( littéral-de-chaîne ) ] ] (2) (depuis C++20)
string-literal - un littéral de chaîne non évalué qui pourrait être utilisé pour expliquer la raison pour laquelle le résultat ne devrait pas être ignoré

Explication

Apparaît dans une déclaration de fonction, une déclaration d'énumération ou une déclaration de classe.

Si, à partir d'une expression à valeur ignorée autre qu'un cast vers void ,

le compilateur est encouragé à émettre un avertissement.

Le string-literal , s'il est spécifié, est généralement inclus dans les avertissements.

(since C++20)

Exemple

struct [[nodiscard]] error_info { /*...*/ };
error_info enable_missile_safety_mode() { /*...*/ return {}; }
void launch_missiles() { /*...*/ }
void test_missiles()
{
    enable_missile_safety_mode(); // le compilateur peut avertir lors de l'abandon d'une valeur nodiscard
    launch_missiles();
}
error_info& foo() { static error_info e; /*...*/ return e; }
void f1() { foo(); } // le type nodiscard n'est pas retourné par valeur, pas d'avertissement
// nodiscard( chaîne-littérale ) (depuis C++20):
[[nodiscard("PURE FUN")]] int strategic_value(int x, int y) { return x ^ y; }
int main()
{
    strategic_value(4, 2); // le compilateur peut avertir lors de l'abandon d'une valeur nodiscard
    auto z = strategic_value(0, 0); // OK : la valeur de retour n'est pas abandonnée
    return z;
}

Sortie possible :

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

Bibliothèque standard

Les fonctions standard suivantes sont déclarées avec l'attribut nodiscard :

Contenu étendu
Fonctions d'allocation
fonctions d'allocation
(fonction)
alloue un stockage non initialisé
(fonction membre publique de std::allocator<T> )
[static]
alloue un stockage non initialisé en utilisant l'allocateur
(fonction membre publique statique de std::allocator_traits<Alloc> )
alloue de la mémoire
(fonction membre publique de std::pmr::memory_resource )
allouer de la mémoire
(fonction membre publique de std::pmr::polymorphic_allocator<T> )
alloue un stockage non initialisé en utilisant l'allocateur externe
(fonction membre publique de std::scoped_allocator_adaptor<OuterAlloc,InnerAlloc...> )
Accès indirect
(C++17)
barrière d'optimisation de pointeur
(modèle de fonction)
informe le compilateur qu'un pointeur est aligné
(fonction template)
Fonctions de vérification de vide
(C++17)
vérifie si le conteneur est vide
(modèle de fonction)
vérifie si le gestionnaire de nœud est vide
(fonction membre publique de node handle )
vérifie si le conteneur est vide
(fonction membre publique de std::array<T,N> )
vérifie si la chaîne est vide
(fonction membre publique de std::basic_string<CharT,Traits,Allocator> )
vérifie si la vue est vide
(fonction membre publique de std::basic_string_view<CharT,Traits> )
vérifie si le conteneur est vide
(fonction membre publique de std::deque<T,Allocator> )
vérifie si le conteneur est vide
(fonction membre publique de std::forward_list<T,Allocator> )
vérifie si le conteneur est vide
(fonction membre publique de std::list<T,Allocator> )
vérifie si le conteneur est vide
(fonction membre publique de std::map<Key,T,Compare,Allocator> )
vérifie si la correspondance a réussi
(fonction membre publique de std::match_results<BidirIt,Alloc> )
vérifie si le conteneur est vide
(fonction membre publique de std::multimap<Key,T,Compare,Allocator> )
vérifie si le conteneur est vide
(fonction membre publique de std::multiset<Key,Compare,Allocator> )
vérifie si l'adaptateur de conteneur est vide
(fonction membre publique de std::priority_queue<T,Container,Compare> )
vérifie si l'adaptateur de conteneur est vide
(fonction membre publique de std::queue<T,Container> )
vérifie si le conteneur est vide
(fonction membre publique de std::set<Key,Compare,Allocator> )
vérifie si la séquence est vide
(fonction membre publique de std::span<T,Extent> )
vérifie si l'adaptateur de conteneur est vide
(fonction membre publique de std::stack<T,Container> )
vérifie si le conteneur est vide
(fonction membre publique de std::unordered_map<Key,T,Hash,KeyEqual,Allocator> )
vérifie si le conteneur est vide
(fonction membre publique de std::unordered_multimap<Key,T,Hash,KeyEqual,Allocator> )
vérifie si le conteneur est vide
(fonction membre publique de std::unordered_multiset<Key,Hash,KeyEqual,Allocator> )
vérifie si le conteneur est vide
(fonction membre publique de std::unordered_set<Key,Hash,KeyEqual,Allocator> )
vérifie si le conteneur est vide
(fonction membre publique de std::vector<T,Allocator> )
vérifie si le chemin est vide
(fonction membre publique de std::filesystem::path )
Divers
(C++11)
exécute une fonction de manière asynchrone (potentiellement dans un nouveau thread) et retourne une std::future qui contiendra le résultat
(modèle de fonction)
(jusqu'à C++26)

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement publié Comportement corrigé
P1771R1 C++17 [[nodiscard]] sur les constructeurs n'a aucun effet peut provoquer un avertissement si l'objet construit est ignoré

Références

  • Norme C++23 (ISO/CEI 14882:2024) :
  • 9.12.9 Attribut Nodiscard [dcl.attr.nodiscard]
  • Norme C++20 (ISO/CEI 14882:2020) :
  • 9.12.8 Attribut Nodiscard [dcl.attr.nodiscard]
  • Norme C++17 (ISO/IEC 14882:2017) :
  • 10.6.7 Attribut Nodiscard [dcl.attr.nodiscard]

Voir aussi

(C++11)
espace réservé pour ignorer un élément lors du déballage d'un tuple en utilisant tie
(constante)
documentation C pour nodiscard