C++ attribute: nodiscard (since C++17)
Если функция, объявленная с
nodiscard
, или функция, возвращающая перечисление или класс, объявленный
nodiscard
по значению, вызывается из
выражения отбрасываемого значения
, отличного от приведения к
void
, компилятору рекомендуется выдавать предупреждение.
Содержание |
Синтаксис
[
[
nodiscard
]
]
|
(1) | (начиная с C++17) | |||||||
[
[
nodiscard
(
строковый литерал
)
]
]
|
(2) | (начиная с C++20) | |||||||
| string-literal | - | an unevaluated string literal that could be used to explain the rationale for why the result should not be discarded |
Объяснение
Появляется в объявлении функции, объявлении перечисления или объявлении класса.
Если из discarded-value expression , отличного от приведения к void ,
-
вызывается функция, объявленная с
nodiscard, или -
вызывается функция, возвращающая перечисление или класс, объявленный с
nodiscardпо значению, или -
конструктор, объявленный с
nodiscard, вызывается через явное преобразование типа или static_cast , или -
объект типа перечисления или класса, объявленного с
nodiscard, инициализируется через явное преобразование типа или static_cast ,
компилятору рекомендуется выдать предупреждение.
|
Строковый литерал string-literal , если указан, обычно включается в предупреждения. |
(since C++20) |
Пример
struct [[nodiscard]] error_info { /*...*/ }; error_info enable_missile_safety_mode() { /*...*/ return {}; } void launch_missiles() { /*...*/ } void test_missiles() { enable_missile_safety_mode(); // компилятор может предупредить об отбрасывании nodiscard значения launch_missiles(); } error_info& foo() { static error_info e; /*...*/ return e; } void f1() { foo(); } // nodiscard тип не возвращается по значению, предупреждения нет // nodiscard( строковый литерал ) (начиная с C++20): [[nodiscard("PURE FUN")]] int strategic_value(int x, int y) { return x ^ y; } int main() { strategic_value(4, 2); // компилятор может предупредить об отбрасывании nodiscard значения auto z = strategic_value(0, 0); // OK: возвращаемое значение не отбрасывается 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
|
|