C++ 属性: nodiscard (C++17 起)
来自cppreference.com
< cpp | language | attributes
在转换到 void 之外的弃值表达式中调用声明为 nodiscard
的函数,或调用按值返回声明为 nodiscard
的枚举或类的函数时,鼓励编译器发布警告。
目录 |
[编辑]语法
[[nodiscard]] | (1) | (C++17 起) | |||||||
[[nodiscard( 字符串字面量)]] | (2) | (C++20 起) | |||||||
字符串字面量 | - | 能用于解释结果不应被舍弃的理由的不求值字符串字面量 |
[编辑]解释
出现在函数声明、枚举声明或类声明中。
在转换到 void 之外的弃值表达式中,
- 调用声明为
nodiscard
的函数,或 - 调用按值返回声明为
nodiscard
的枚举或类的函数,或 - 以显式类型转换或 static_cast 形式调用声明为
nodiscard
的构造函数,或 - 以显式类型转换或 static_cast 形式构造声明为
nodiscard
的枚举或类的对象,
则鼓励编译器发布警告。
若指定了 字符串字面量,则它通常被包含于警告中。 | (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++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
P1771R1 | C++17 | 构造函数上的 [[nodiscard]] 无效果 | 若舍弃该对象则能导致警告 |
[编辑]引用
- C++23 标准(ISO/IEC 14882:2024):
- 9.12.9 Nodiscard attribute [dcl.attr.nodiscard]
- C++20 标准(ISO/IEC 14882:2020):
- 9.12.8 Nodiscard attribute [dcl.attr.nodiscard]
- C++17 标准(ISO/IEC 14882:2017):
- 10.6.7 Nodiscard attribute [dcl.attr.nodiscard]
[编辑]参阅
(C++11) | 用 tie 解包 tuple 时用来跳过元素的占位符 (常量) |
nodiscard 的 C 文档 |