将NULL转换为long是不是很暧昧?

Pab*_*dhy 7 c++ c++11

我正在尝试使用NULL与nullptr的用法.由于NULL可以转换为整数类型,因此下面的示例应该显示模糊性,但它不是!!

它显示了模糊的候选编译错误,如果它是unsigned long,而不是signed long.

任何人都可以解释为什么!!

#include <iostream>
using namespace std;

// NOTE: 
// "long" or "signed long" is not showing ambiguous candidates
// but "unsigned long" does

void func(long st) {
    cout << "overload func\n";
}

void func(int* ptr) {
    cout << "integer pointer overload func\n";
}

int main() {
    func(NULL);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

vll*_*vll 11

在C++中,NULL被定义为整数类型.您的编译器可能将其定义为long,因为它匹配该重载.C++标准明确声明(草案N3936,第444页):

[NULL NULL]的可能定义包括0和0L,但不包括(void*)0.

这种限制是必要的,因为例如char *p = (void*)0有效的C但无效的C++,而char *p = 0两者都有效.


Bar*_*rry 7

由于NULL可以将其转换为整数类型,因此下面的示例应该显示模糊性,但它不是!!

问题NULL,这是引入的动机之一nullptr,是你真的不能说它应该如何表现.有许多不同的方法NULL可以定义,并且根据定义的选择,你可能在这里有不同的行为 - 它可能导致后面的两个函数中的任何一个被调用模糊不清.您不能不知道您的供应商如何定义该宏.

好消息nullptr是它毫无疑问会调用int*重载.