C ++ 17 [[nodiscard]]
C ++ 17 padronizou o "valor de retorno do negócio ignorado" com um atributo.
Portanto, espero que as implementações compatíveis sempre avisem apenas quando nodiscard
forem fornecidas e nunca avisem o contrário.
Exemplo:
main.cpp
[[nodiscard]] int f() {
return 1;
}
int main() {
f();
}
compilar:
g++ -std=c++17 -ggdb3 -O0 -Wall -Wextra -pedantic -o main.out main.cpp
resultado:
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() {
|
Todos os itens a seguir evitam o aviso:
(void)f();
[[maybe_unused]] int i = f();
Não consegui usar maybe_unused
diretamente na f()
chamada:
[[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();
| ^~~~~~~~~~~~~~~~
O (void)
trabalho do elenco não parece ser obrigatório, mas é "encorajado" no padrão: Como posso descartar intencionalmente um valor de retorno [[nodiscard]]?
Também como visto na mensagem de aviso, uma "solução" para o aviso é adicionar -Wno-unused-result
:
g++ -std=c++17 -ggdb3 -O0 -Wall -Wextra -pedantic -Wno-unused-result -o main.out main.cpp
embora eu não recomende, é claro, ignorar avisos globalmente como este.
C ++ 20 também permite que você adicione uma razão para o nodiscard
que no [[nodiscard("reason")]]
como mencionado em: https://en.cppreference.com/w/cpp/language/attributes/nodiscard
warn_unused_result
Atributo GCC
Antes da padronização de [[nodiscard]]
e para C antes de finalmente decidirem padronizar atributos, o GCC implementou exatamente a mesma funcionalidade com warn_unused_result
:
int f() __attribute__ ((warn_unused_result));
int f() {
return 1;
}
int main() {
f();
}
que 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();
| ~^~
Deve-se notar então que, uma vez que ANSI C não tem um padrão para isso, ANSI C não especifica quais funções de biblioteca padrão C têm o atributo ou não e, portanto, as implementações tomaram suas próprias decisões sobre o que deve ou não ser marcado com warn_unuesd_result
, qual é por isso que, em geral, você teria que usar o (void)
elenco para ignorar retornos de quaisquer chamadas para funções de biblioteca padrão para evitar totalmente os avisos em qualquer implementação.
Testado em GCC 9.2.1, Ubuntu 19.10.