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

C++中是否存在忽略返回值时触发致命编译错误的特性?

有没有比[[nodiscard]]更严格的编译级强制检查?

C++标准本身并没有提供像你设想的[[harshnodiscard]]这类直接强制忽略返回值就触发编译错误的特性,[[nodiscard]]仅能触发编译器警告,而非强制错误。不过可以通过以下两种方式实现类似的严格检查效果:

编译器扩展配合编译选项

主流编译器都支持将特定警告升级为错误,结合对应的返回值检查属性就能达到目的:

  • GCC/Clang:使用__attribute__((warn_unused_result))标记函数,再配合编译选项-Werror=unused-result,将忽略返回值的警告转为致命错误。示例代码:
    __attribute__((warn_unused_result)) int getSize() { return 0; }
    
    编译时添加-Werror=unused-result,任何忽略getSize()返回值的代码都会直接编译失败。
  • MSVC:使用_Check_return_属性标记函数,再通过/WX(全局警告转错误)或/WX:unused-result(仅针对该类警告转错误)的编译选项,实现强制检查。示例代码:
    _Check_return_ int getSize() { return 0; }
    

自定义返回类型强制处理

通过封装返回值为一个特殊类型,强制用户必须显式获取结果,否则编译报错。比如定义一个析构函数私有、必须通过成员方法获取值的类:

class MustUse {
public:
    explicit MustUse(int val) : value(val) {}
    int get() const { return value; } // 必须调用此方法获取实际值
private:
    ~MustUse() = delete; // 禁止自动销毁未处理的对象
};

MustUse getSize() { return MustUse(0); }

此时如果直接调用getSize();,编译器会因为无法销毁MustUse对象(析构函数私有)而报错,必须显式获取值:int size = getSize().get();。这种方式会改变函数返回类型,但能在代码层面强制用户处理返回值,不依赖编译器选项。

内容的提问来源于stack exchange,提问作者TwistedBlizzard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:05:38