修复歧义的方法

时间:2017-08-09 16:23:04

标签: c++ overloading implicit-conversion ambiguity

我被问到以下示例,而不修改函数声明和调用。

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怎么办?如何解决?

2 个答案:

答案 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
}