我想更新我的库的 API,以便编译器在用户调用
const
标记的方法时发出警告,然后忽略该方法的返回值。原因是因为 const
方法没有副作用,调用它的唯一原因就是检查它的返回值......所以如果程序员不这样做,那几乎肯定是一个错误,并且应该引起程序员的注意。 (在极少数情况下,程序员确实有意这样做,他应该在调用中添加一个 (void)
标记,以明确他不寻常的决定)
C++17 的
[[nodiscard]]
属性提供了这种行为,但是将 [[nodiscard]]
添加到成千上万个带有 const
标记的方法中的每一个是乏味的,而且(更糟糕的是)会使头文件变得杂乱无章;如果有一些编译器标志我可以用来告诉我的编译器任何const
标记的方法也应该被默认视为[[nodiscard]]
,那就更好了。
这样的编译器标志是否存在? FWIW 我主要使用 clang++,但有时也使用 g++ 和 MSVC。
FWIW 我试过
-Wunused-result
,但这似乎对编译器的行为没有任何影响。
下面的用法示例:
class MyContainer
{
public:
MyContainer() : _count(0) {/* empty */}
// This works but it would be better if `const` implied `[[nodiscard]]`
[[nodiscard]] bool IsEmpty() const {return (_count == 0);}
private:
int _count;
};
int main(int argc, char ** argv)
{
MyContainer c;
c.IsEmpty(); // should generate a warning, because the user didnt' use the result, so calling the const-method makes no sense
return 0;
}