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
якості в [[nodiscard("reason")]]
якості згадується: https://en.cppreference.com/w/cpp/language/attributes/nodiscard
GCC 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.