You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 绿色

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 04:50:15