6.7.13.3 nodiscard 属性
约束
nodiscard只能用于:- 函数;
- 结构体、联合体或枚举类型的定义。
若带参数子句,则形式必须是:
c
("string-literal")1
语义
- 如果实现支持该属性,那么:
c
__has_c_attribute(nodiscard)1
应返回 202311L。
名字或实体即使最初未标记
nodiscard,之后也可以重声明为带该属性;反过来也可以。只要第一次带该属性的声明已经出现,该实体就被视为已标记。
推荐实践
所谓
nodiscard调用,是指:- 调用了一个先前声明为
nodiscard的函数; - 或其返回类型本身是被标记为
nodiscard的结构体、联合体或枚举类型。
- 调用了一个先前声明为
若把这样的调用直接当成
void表达式使用,除非显式强制转换为void,否则标准不鼓励这样做。实现应倾向于对这种“立即丢弃返回值”的行为给出诊断。
若属性带字符串参数,诊断消息应包含该字符串。
例子
若某函数返回
[[nodiscard]]结构体类型,那么即使函数本身没写[[nodiscard]],直接丢弃返回值也仍然应被诊断。若返回值先保存到对象中,即便这个对象随后没被使用,标准也不鼓励对函数调用本身给出同类诊断。