C++ attribute: nodiscard (since C++17)
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 ,
-
une fonction déclarée
nodiscardest appelée, ou -
une fonction retournant une énumération ou une classe déclarée
nodiscardpar valeur est appelée, ou -
un constructeur déclaré
nodiscardest appelé par conversion de type explicite ou static_cast , ou -
un objet d'un type énumération ou classe déclaré
nodiscardest initialisé par conversion de type explicite ou static_cast ,
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
|
(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
|
|