使用std::unary_function时发出Lint警告

Lint warnings when using std::unary_function

本文关键字:Lint 警告 function std unary 使用      更新时间:2023-10-16

检查从std::unary_function派生的函子时,如下所示

struct IsInterestingMsg : public std::unary_function<string,bool>

Lint弹出以下信息/警告:

1790: Base class 'std::unary_function<std::basic_string<char>,bool>' has no non-destructor virtual functions

Warning 1509: base class destructor for class 'unary_function' is not virtual

根据Scott Meyers,函子类应该通过从unary/binary_function派生而具有可适应性,CCD_1基本上只是类型定义的集合,因此,它们不是需要任何构造函数/析构函数的类。因此,皮棉警告本身是正确的。

有人知道如何在全局范围内抑制这些警告吗。?我想避免每次使用-e1509时都写它。

信息#1790可以通过使用私有继承而不是公共继承来抑制,但警告#1509仍然存在。

以下抑制对我有效:

/*lint -esym(1790, "std::unary_function<*,*>") -esym(1509, unary_function) */

这里有几个陷阱:

  • 注意esym参数的引号,这样Lint就不会解释模板参数列表中的逗号
  • 消息1790是在"Symbol"上参数化的,因此在引用它时必须使用完整的命名空间
  • 另一方面,消息1509是在"Name"上参数化的,因此您不应该使用它来提供完整的命名空间

至于什么时候使用名称空间,什么时候省略它,只要使用Lint错误消息中引用的字符串就可以了。缺点是似乎没有办法为std::unary_function禁用1509,但对ns::unaary_function则没有。

叹气,lint应该知道。。。无论如何,从一元函数派生得到的是一些嵌套的typedef,请参阅http://www.cplusplus.com/reference/functional/unary_function/.您可以自己创建这些,而不是继承它们。

另一种方法是在lint运行时,在unary_function中有条件地声明一个虚拟析构函数。不过,我个人不会为了lint而破坏完全有效的代码,无论是以这种方式还是另一种方式。