C ++ 17 [[nodiscard]]
C ++ 17 a normalisé la "valeur de retour entreprise ignorée" avec un attribut.
Par conséquent, j'espère que les implémentations conformes avertiront toujours seulement quand nodiscard
est donné, et jamais avertiront autrement.
Exemple:
main.cpp
[[nodiscard]] int f() {
return 1;
}
int main() {
f();
}
compiler:
g++ -std=c++17 -ggdb3 -O0 -Wall -Wextra -pedantic -o main.out main.cpp
résultat:
main.cpp: In function ‘int main()’:
main.cpp:6:6: warning: ignoring return value of ‘int f()’, declared with attribute nodiscard [-Wunused-result]
6 | f();
| ~^~
main.cpp:1:19: note: declared here
1 | [[nodiscard]] int f() {
|
Les éléments suivants évitent tous l'avertissement:
(void)f();
[[maybe_unused]] int i = f();
Je n'ai pas pu utiliser maybe_unused
directement sur l' f()
appel:
[[maybe_unused]] f();
donne:
main.cpp: In function ‘int main()’:
main.cpp:6:5: warning: attributes at the beginning of statement are ignored [-Wattributes]
6 | [[maybe_unused]] f();
| ^~~~~~~~~~~~~~~~
Le (void)
travail de fonte ne semble pas obligatoire mais est "encouragé" dans la norme: Comment puis-je supprimer intentionnellement une valeur de retour [[nodiscard]]?
Comme le montre également le message d'avertissement, une «solution» à l'avertissement consiste à ajouter -Wno-unused-result
:
g++ -std=c++17 -ggdb3 -O0 -Wall -Wextra -pedantic -Wno-unused-result -o main.out main.cpp
bien que je ne recommanderais bien sûr pas d'ignorer les avertissements globalement comme celui-ci.
C ++ 20 vous permet également d'ajouter une raison de l' nodiscard
comme [[nodiscard("reason")]]
mentionné à: https://en.cppreference.com/w/cpp/language/attributes/nodiscard
warn_unused_result
Attribut GCC
Avant la standardisation de [[nodiscard]]
, et pour C, avant de décider finalement de standardiser les attributs, GCC a implémenté exactement la même fonctionnalité avec warn_unused_result
:
int f() __attribute__ ((warn_unused_result));
int f() {
return 1;
}
int main() {
f();
}
qui donne:
main.cpp: In function ‘int main()’:
main.cpp:8:6: warning: ignoring return value of ‘int f()’, declared with attribute warn_unused_result [-Wunused-result]
8 | f();
| ~^~
Il convient de noter alors que puisque ANSI C n'a pas de norme pour cela, ANSI C ne spécifie pas quelles fonctions de bibliothèque standard C ont l'attribut ou non et par conséquent, les implémentations ont pris leurs propres décisions sur ce qui devrait ou non être marqué warn_unuesd_result
, qui C'est pourquoi, en général, vous devriez utiliser le (void)
cast pour ignorer les retours de tout appel aux fonctions de bibliothèque standard pour éviter complètement les avertissements dans toute implémentation.
Testé dans GCC 9.2.1, Ubuntu 19.10.