C++ attribute: nodiscard (since C++17)
From cppreference.net
<
cpp
|
language
|
attributes
如果从
弃值表达式
(除强制转换为
void
外)中调用声明为
nodiscard
的函数,或调用通过值返回声明为
nodiscard
的枚举或类的函数,建议编译器发出警告。
目录 |
语法
[
[
nodiscard
]
]
|
(1) | (自 C++17 起) | |||||||
[
[
nodiscard
(
字符串字面量
)
]
]
|
(2) | (自 C++20 起) | |||||||
| string-literal | - | 一个 未求值字符串字面量 ,可用于解释不应丢弃结果的原因说明 |
说明
出现在函数声明、枚举声明或类声明中。
如果,从 弃值表达式 (除强制转换为 void 之外),
-
声明为
nodiscard的函数被调用时,或 -
返回以值传递方式声明的
nodiscard枚举或类的函数被调用时,或 -
通过
显式类型转换
或
static_cast
调用声明为
nodiscard的构造函数时,或 -
通过
显式类型转换
或
static_cast
初始化声明为
nodiscard的枚举或类类型对象时,
编译器被鼓励发出警告。
|
如果指定了 字符串字面量 ,通常会将其包含在警告信息中。 |
(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); // 正常:返回值未被丢弃 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++ 标准。
| 缺陷报告 | 应用于 | 发布时的行为 | 正确行为 |
|---|---|---|---|
| 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 文档
关于
nodiscard
|
|