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
相关产品推荐
相关产品推荐

