升级一些遗留代码后,我开始收到来自 g++ 的“警告:将 NULL 传递给 'Identifier::Identifier(int)' [-Wconversion-null] 的非指针参数 1”消息。大多数情况下这很好,但似乎没有考虑到具有多个构造函数的类。
例如,拿这个测试代码:
#include <stdio.h>
class Identifier
{
private:
int m_iID;
public:
Identifier(const char* p_c) { m_iID = p_c ? p_c[0] : 0; }
Identifier(int i) { m_iID = i; }
};
int main(int argc, char* argv[])
{
Identifier* p_ID = new Identifier(NULL);
return 0;
}
(请忽略构造函数的实际作用,这只是问题的一个说明。对于上下文,有问题的代码是一个以哈希值形式存储标识符的类。构造函数可以将字符串转换为散列,或直接散列值。)
倒数第三行的“new”语句会引发此警告。令我困惑的是 g++ 显然假设它需要使用 Identifier(int i) 构造函数,而忽略了 Identifier(const char* p_c) 构造函数,它是一个指针。
请注意,将整数更改为无符号整数会导致歧义错误,这是 32 位系统。
我知道指定 -Wno-conversion-null 可以解决问题,就像传递 0 或将 NULL 显式转换为 const char* 一样。但我很好奇为什么看似有效的构造函数被忽略了。另外,我想避免大量的搜索和替换工作,同时保持警告处于活动状态。