Атрибут C++: nodiscard (начиная с C++17)
Если вызывается функция, объявленная nodiscard, или функция, возвращающая по значению перечисление или класс, объявленные nodiscard, из выражения с отбрасываемым значением, отличного от преобразования к void, компилятору рекомендуется выдать предупреждение.
Синтаксис
[[nodiscard]] | (1) | (начиная с C++17) |
[[nodiscard( строковый литерал )]] | (2) | (начиная с C++20) |
| строковый литерал | - | невычисляемый строковый литерал, который можно использовать для пояснения причины, по которой результат не следует отбрасывать |
Пояснение
Используется в объявлении функции, перечисления или класса.
Если из выражения с отбрасываемым значением, отличного от преобразования к void,
- вызывается функция, объявленная
nodiscard, или - вызывается функция, возвращающая по значению перечисление или класс, объявленные
nodiscard, или - вызывается конструктор, объявленный
nodiscard, посредством явного преобразования типа илиstatic_cast, или - объект перечислимого типа или типа класса, объявленного
nodiscard, инициализируется посредством явного преобразования типа илиstatic_cast,
компилятору рекомендуется выдать предупреждение.
| Указанный строковый литерал обычно включается в предупреждения. | (начиная с C++20) |
Пример
struct [[nodiscard]] error_info { /*...*/ };
error_info enable_missile_safety_mode() { /*...*/ return {}; }
void launch_missiles() { /*...*/ }
void test_missiles()
{
enable_missile_safety_mode(); // compiler may warn on discarding a nodiscard value
launch_missiles();
}
error_info& foo() { static error_info e; /*...*/ return e; }
void f1() { foo(); } // nodiscard type is not returned by value, no warning
// nodiscard( string-literal ) (since C++20):
[[nodiscard("PURE FUN")]] int strategic_value(int x, int y) { return x ^ y; }
int main()
{
strategic_value(4, 2); // compiler may warn on discarding a nodiscard value
auto z = strategic_value(0, 0); // OK: return value is not discarded
return z;
}
Возможный вывод:
game.cpp:5:4: warning: ignoring return value of function declared with ⮠ 'nodiscard' attribute game.cpp:17:5: warning: ignoring return value of function declared with ⮠ 'nodiscard' attribute: PURE FUN
Стандартная библиотекаСледующие функции стандартной библиотеки объявлены с атрибутом
| (до C++26) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.
| DR | Применён к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| P1771R1 | C++17 |
[[nodiscard]] у конструкторов не действует | может привести к предупреждению, если созданный объект отбрасывается |
Ссылки
- Стандарт C++23 (ISO/IEC 14882:2024):
- 9.12.9 Атрибут nodiscard [dcl.attr.nodiscard]
- Стандарт C++20 (ISO/IEC 14882:2020):
- 9.12.8 Атрибут nodiscard [dcl.attr.nodiscard]
- Стандарт C++17 (ISO/IEC 14882:2017):
- 10.6.7 Атрибут nodiscard [dcl.attr.nodiscard]
См. также
|
(C++11) | заполнитель для пропуска элемента при распаковке tuple с помощью tie (константа) |
Документация C для nodiscard |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/language/attributes/nodiscard