使用std::unary_function时发出Lint警告
Lint warnings when using std::unary_function
检查从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而破坏完全有效的代码,无论是以这种方式还是另一种方式。
相关文章:
- 警告处理为错误这里有什么问题
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- cppcheck在const std::string[]上引发警告
- GCC对可能有效的代码抛出init list生存期警告
- 如何在BST的这个简单递归实现中消除警告
- 关于std::move的使用,是否有编译警告
- g++ 在某个类成员未初始化时不发出警告
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 使用typeid警告未使用的变量
- 示例C++项目编译中的警告
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 如何修复编译器警告 C6386 和 C6385?
- 返回语句后的代码,没有警告
- 获取隐式转换溢出从无符号到已签名的警告
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 在未链接的部分上生成警告
- FlexeLint/PC lint警告说,不考虑std::string::append的返回值
- 迭代器使用-Lint警告
- 使用std::unary_function时发出Lint警告
- Lint警告559的问题