我被问到以下示例,而不修改函数声明和调用。
void Display(int *nData)
{
}
void Display(float *fData)
{
}
int main()
{
int a = 5;
float b = 4.0f;
Display(&a);
Display(&b);
Display(nullptr or NULL); // Ambiguity here, as nullptr or NULL (0) can be converted implicitly by compiler to both int and float
return 0;
}
有什么想法吗? 感谢
编辑:感谢您使用带有重载的std :: nullptr_t修复此问题的答案,但是如果参数是“NULL”而不是nullptr怎么办?如何解决?答案 0 :(得分:4)
这可以通过添加" dummy"来解决。重载采用std::nullptr_t
参数:
void Display(std::nullptr_t)
{
}
传递nullptr
时将调用此方法。
宏NULL
和之前推荐的空指针0
是有问题的,因为它们会再次引入歧义。
解决0
很简单,只需添加另一个重载,将一个简单的int
(不是指针)作为参数。这个可能也解决了NULL
的歧义,但也可能没有。
the NULL
macro的问题在于它的实现已定义。 可能会扩展为nullptr
。 可能会扩展为0
。或者它可能被扩展为其他整数文字,其评估为零,但是未知类型。
例如,我当前的系统NULL
定义为0LL
,即long long int
。
要处理所有当前可能的空指针,您需要以下重载:
void Display(std::nullptr_t); // For nullptr
void Display(int); // For 0 and some implementations of NULL
void Display(long); // For some implementations of NULL
void Display(long long); // For some implementations of NULL
答案 1 :(得分:2)
您可以将nullptr_t
与其他重载一起使用:
void Display(std::nullptr_t nullData)
{
// Handle special case of nullptr
}