C ++ 17 [[nodiscard]]
C ++ 17 стандартизировал «бизнес без учета возвращаемого значения» с помощью атрибута.
Поэтому я надеюсь, что совместимые реализации всегда будут предупреждать, только когда nodiscard
заданы, и никогда не предупреждать иначе.
Пример:
main.cpp
[[nodiscard]] int f() {
return 1;
}
int main() {
f();
}
компиляции:
g++ -std=c++17 -ggdb3 -O0 -Wall -Wextra -pedantic -o main.out main.cpp
результат:
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() {
|
Следующее все избегает предупреждения:
(void)f();
[[maybe_unused]] int i = f();
Мне не удалось использовать maybe_unused
прямо во время f()
звонка:
[[maybe_unused]] f();
дает:
main.cpp: In function ‘int main()’:
main.cpp:6:5: warning: attributes at the beginning of statement are ignored [-Wattributes]
6 | [[maybe_unused]] f();
| ^~~~~~~~~~~~~~~~
Работа с (void)
приведением типов не является обязательной, но "поощряется" в стандарте: Как я могу намеренно отказаться от возвращаемого значения [[nodiscard]]?
Также, как видно из предупреждающего сообщения, одним из «решений» предупреждения является добавление -Wno-unused-result
:
g++ -std=c++17 -ggdb3 -O0 -Wall -Wextra -pedantic -Wno-unused-result -o main.out main.cpp
хотя я бы, конечно, не рекомендовал игнорировать подобные предупреждения во всем мире.
C ++ 20 также позволяет добавлять причину в nodiscard
as, [[nodiscard("reason")]]
как указано по адресу: https://en.cppreference.com/w/cpp/language/attributes/nodiscard
НКУ warn_unused_result
Атрибут
Перед стандартизацией [[nodiscard]]
и для C, прежде чем они окончательно решат стандартизировать атрибуты, GCC реализовал точно такую же функциональность с warn_unused_result
:
int f() __attribute__ ((warn_unused_result));
int f() {
return 1;
}
int main() {
f();
}
который дает:
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();
| ~^~
Следует отметить, что, поскольку ANSI C не имеет стандарта для этого, ANSI C не указывает, какие функции стандартной библиотеки C имеют атрибут или нет, и поэтому реализации сами приняли решение о том, что следует или не отмечать warn_unuesd_result
, что Вот почему в общем случае вам придется использовать (void)
приведение, чтобы игнорировать возврат любых вызовов стандартных библиотечных функций, чтобы полностью избежать предупреждений в любой реализации.
Протестировано в GCC 9.2.1, Ubuntu 19.10.