如何为重载的==运算符触发「语句无作用」警告?
让重载的
operator==触发未使用值警告的解决方案 先重现下你的问题场景,方便大家理解:
测试代码
class Test { public: Test(int _value) { value = _value; }; const bool operator==(int _value) const { return value == _value; }; private: int value; }; int main(void) { int a; a == 1; Test b(1); b == 1; return 0; }
编译命令及原有输出
$ g++ -Wall -pedantic -o test test.cc a.cc: In function ‘int main()’: a.cc:13:7: warning: statement has no effect [-Wunused-value] a == 1; ^
解决办法
要让对象调用重载==的语句也触发-Wunused-value警告,你需要给重载的operator==添加「返回值必须被使用」的属性,有两种方式可选:
1. C++17及以上标准:使用[[nodiscard]]属性
这是C++标准提供的跨编译器方案,直接在运算符声明前加上[[nodiscard]]即可:
class Test { public: Test(int _value) { value = _value; }; [[nodiscard]] const bool operator==(int _value) const { return value == _value; }; private: int value; };
2. GCC专属方案:__attribute__((warn_unused_result))
如果需要兼容更早的C++版本,或者只针对GCC系列编译器,可以用这个GCC扩展属性:
class Test { public: Test(int _value) { value = _value; }; const bool operator==(int _value) const __attribute__((warn_unused_result)) { return value == _value; }; private: int value; };
测试效果
修改后再用原来的命令编译,两条未使用结果的语句都会触发警告了:
$ g++ -Wall -pedantic -o test test.cc test.cc: In function ‘int main()’: test.cc:13:7: warning: statement has no effect [-Wunused-value] a == 1; ^ test.cc:15:7: warning: statement has no effect [-Wunused-value] b == 1; ^
背后的原因
GCC的-Wunused-value默认只针对内置类型的操作/表达式发出警告——因为编译器能确定这些操作没有副作用,忽略返回值大概率是笔误。但对于用户自定义的函数(包括重载运算符),编译器默认认为你可能是故意调用它来执行副作用(比如某些运算符内部可能有日志、状态修改等),所以不会主动警告未使用返回值的情况。
通过添加上述属性,我们明确告诉编译器:这个运算符的返回值是关键,忽略它属于错误,需要触发警告。
内容的提问来源于stack exchange,提问作者Dave Lawrence
相关产品推荐
相关产品推荐

