C ++ 17 [[nodiscard]]
C ++ 17 estandarizó el "valor de retorno empresarial ignorado" con un atributo.
Por lo tanto, espero que las implementaciones compatibles siempre avisen solo cuando nodiscard
se da, y nunca advierten lo contrario.
Ejemplo:
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
Salir:
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 los siguientes evitan la advertencia:
(void)f();
[[maybe_unused]] int i = f();
No pude usar maybe_unused
directamente en la f()
llamada:
[[maybe_unused]] f();
da:
main.cpp: In function ‘int main()’:
main.cpp:6:5: warning: attributes at the beginning of statement are ignored [-Wattributes]
6 | [[maybe_unused]] f();
| ^~~~~~~~~~~~~~~~
El (void)
trabajo de yeso no parece ser obligatorio, pero está "recomendado" en el estándar: ¿Cómo puedo descartar intencionalmente un valor de retorno [[nodiscard]]?
También como se ve en el mensaje de advertencia, una "solución" a la advertencia es agregar -Wno-unused-result
:
g++ -std=c++17 -ggdb3 -O0 -Wall -Wextra -pedantic -Wno-unused-result -o main.out main.cpp
aunque, por supuesto, no recomendaría ignorar las advertencias a nivel mundial como esta.
C ++ 20 también permite añadir una razón para la nodiscard
que en [[nodiscard("reason")]]
como se mencionó en: https://en.cppreference.com/w/cpp/language/attributes/nodiscard
warn_unused_result
Atributo GCC
Antes de la estandarización de [[nodiscard]]
, y para C antes de que finalmente decida estandarizar los atributos, GCC implementó exactamente la misma funcionalidad con warn_unused_result
:
int f() __attribute__ ((warn_unused_result));
int f() {
return 1;
}
int main() {
f();
}
lo que da:
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();
| ~^~
Cabe señalar, entonces, que dado que ANSI C no tiene un estándar para esto, ANSI C no especifica qué funciones de biblioteca estándar de C tienen el atributo o no y, por lo tanto, las implementaciones han tomado sus propias decisiones sobre qué se debe marcar o no con warn_unuesd_result
, qué Por eso, en general, tendría que usar la (void)
conversión para ignorar los retornos de cualquier llamada a las funciones de biblioteca estándar para evitar completamente las advertencias en cualquier implementación.
Probado en GCC 9.2.1, Ubuntu 19.10.