Namespaces
Variants

C attribute: nodiscard (since C23)

From cppreference.net

Si une fonction déclarée nodiscard ou une fonction renvoyant une structure/union/enumération 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 ]]
[[ __nodiscard__ ]]
(1)
[[ nodiscard ( littéral de chaîne ) ]]
[[ __nodiscard__ ( littéral de chaîne ) ]]
(2)
string-literal - texte 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 struct/union.

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

  • une fonction déclarée nodiscard est appelée, ou
  • une fonction retournant une structure/union/enumération déclarée nodiscard est appelée,

le compilateur est encouragé à émettre un avertissement.

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

Exemple

struct [[nodiscard]] error_info { int status; /*...*/ };
struct error_info enable_missile_safety_mode() { /*...*/ return (struct error_info){0}; }
void launch_missiles() { /*...*/ }
void test_missiles() {
   enable_missile_safety_mode(); // le compilateur peut avertir lors de l'abandon d'une valeur nodiscard
   launch_missiles();
}
struct error_info* foo() { static struct error_info e; /*...*/ return &e; }
void f1() {
    foo(); // le type nodiscard lui-même n'est pas retourné, aucun avertissement
}
// nodiscard( chaîne-littérale ):
[[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
    int 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

Voir aussi

Documentation C++ pour nodiscard