C++中为何要给const类成员函数添加[[nodiscard]]属性?
关于[[nodiscard]]属性的疑问与解释
问题场景
在C++20项目中,CLion建议为const类成员函数的定义添加[[nodiscard]]属性,示例代码如下:
class Test { public: [[nodiscard]] int f(int a, int b) const { return a + b; } };
CLion的解释为:
添加C++17引入的[[nodiscard]]属性,以便在编译期突出显示哪些返回值不应被忽略。
查阅相关说明:
若从除转换为void之外的丢弃值表达式中调用声明为nodiscard的函数,或调用按值返回声明为nodiscard的枚举或类的函数,或通过显式类型转换或static_cast调用声明为nodiscard的构造函数,或通过显式类型转换或static_cast初始化声明为nodiscard的枚举或类类型的对象,编译器应发出警告。
疑问点:
- 为何在此位置需要该注解?
- 若调用者会进一步处理返回值,编译器为何会提示忽略?
- 能否直观解释该注解到底告知编译器什么以及其必要性?
直观解释与必要性
[[nodiscard]]的核心作用不是“强制你必须用返回值”,而是给编译器传递一个明确信号:这个函数的返回值是它存在的核心意义,忽略它大概率是代码编写时的疏忽。
拿示例里的f()函数来说,它是const成员函数,不会修改类的任何状态,唯一的功能就是返回a+b的计算结果。如果有人写了test.f(1,2);却完全不用这个返回值,这行代码等于白写——要么是忘了写后续使用结果的逻辑,要么是误调用了函数,这都是典型的低级失误。
再拆解这个属性的细节:
- 它是一种“提醒机制”,不是强制约束:如果调用者确实有合理理由忽略返回值,只要显式把返回值转成
void(比如static_cast<void>(test.f(1,2));),编译器就不会发出警告。 - 必要性在于提前拦截潜在bug:比如调用返回错误码的函数却没检查、调用计算函数却忘了用结果、调用内存分配函数却没接收指针,这些小问题如果没被及时发现,上线后可能引发难以排查的故障。
内容的提问来源于stack exchange,提问作者Green 绿色
相关产品推荐
相关产品推荐

