C ++ 17 [[nodiscard]]
C ++ 17 ha standardizzato il "valore di ritorno ignorato business" con un attributo.
Pertanto, spero che le implementazioni conformi avvisino sempre solo quando nodiscard
viene fornito e non avvertano mai altrimenti.
Esempio:
main.cpp
[[nodiscard]] int f() {
return 1;
}
int main() {
f();
}
compilare:
g++ -std=c++17 -ggdb3 -O0 -Wall -Wextra -pedantic -o main.out main.cpp
risultato:
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() {
|
Tutto ciò che segue evita l'avvertimento:
(void)f();
[[maybe_unused]] int i = f();
Non sono riuscito a utilizzare maybe_unused
direttamente durante la f()
chiamata:
[[maybe_unused]] f();
dà:
main.cpp: In function ‘int main()’:
main.cpp:6:5: warning: attributes at the beginning of statement are ignored [-Wattributes]
6 | [[maybe_unused]] f();
| ^~~~~~~~~~~~~~~~
Il (void)
cast working non sembra essere obbligatorio ma è "incoraggiato" nello standard: come posso scartare intenzionalmente un valore di ritorno [[nodiscard]]?
Inoltre, come si vede dal messaggio di avviso, una "soluzione" all'avviso è aggiungere -Wno-unused-result
:
g++ -std=c++17 -ggdb3 -O0 -Wall -Wextra -pedantic -Wno-unused-result -o main.out main.cpp
anche se ovviamente non consiglierei di ignorare gli avvisi a livello globale come questo.
C ++ 20 permette anche di aggiungere un motivo per il nodiscard
quale in [[nodiscard("reason")]]
come accennato: https://en.cppreference.com/w/cpp/language/attributes/nodiscard
warn_unused_result
Attributo GCC
Prima della standardizzazione di [[nodiscard]]
, e per C prima che decidessero finalmente di standardizzare gli attributi, GCC implementava la stessa identica funzionalità con warn_unused_result
:
int f() __attribute__ ((warn_unused_result));
int f() {
return 1;
}
int main() {
f();
}
che dà:
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();
| ~^~
Va notato quindi che poiché ANSI C non ha uno standard per questo, ANSI C non specifica quali funzioni della libreria standard C hanno l'attributo o meno e quindi le implementazioni hanno preso le proprie decisioni su cosa dovrebbe o non essere contrassegnato con warn_unuesd_result
, quale Questo è il motivo per cui in generale dovresti usare il (void)
cast per ignorare i ritorni di qualsiasi chiamata a funzioni di libreria standard per evitare completamente gli avvisi in qualsiasi implementazione.
Testato in GCC 9.2.1, Ubuntu 19.10.