C++ 属性:nodiscard (自 C++17 起)
来自 cppreference.cn
如果一个被声明为 `nodiscard` 的函数,或者一个返回被声明为 `nodiscard` 的枚举或类的函数以值传递方式被从丢弃值表达式中调用(除了转换为 void 的情况),编译器应发出警告。
目录 |
[编辑] 语法
[[nodiscard]]
|
(1) | (C++17 起) | |||||||
[[nodiscard( string-literal )]] |
(2) | (C++20 起) | |||||||
字符串字面量 | - | 一个未求值的字符串字面量,可用于解释不应丢弃结果的原因。 |
[编辑] 解释
出现在函数声明、枚举声明或类声明中。
如果,从一个丢弃值表达式中(除了转换为 void 的情况):
- 调用了被声明为 `nodiscard` 的函数,或
- 调用了返回被声明为 `nodiscard` 的枚举或类的函数(按值传递),或
- 通过显式类型转换或static_cast调用了被声明为 `nodiscard` 的构造函数,或
- 通过显式类型转换或static_cast初始化了被声明为 `nodiscard` 的枚举或类类型对象,
编译器应发出警告。
如果指定了 string-literal,通常会包含在警告中。 |
(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
标准库以下标准函数使用 `nodiscard` 属性声明:
|
(直到 C++26) |
[编辑] 缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 发布时的行为 | 正确的行为 |
---|---|---|---|
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) |
使用 tie 解包 tuple 时跳过元素的占位符(常量) |
C 文档 for nodiscard
|