将 NULL 转换为长不是模棱两可吗?

Casting NULL to long is not ambigious?

本文关键字:模棱两可 NULL 转换      更新时间:2023-10-16

我正在尝试一个关于 NULL 与 nullptr 用法的示例。 由于 NULL 可以转换为整数类型,因此它应该在下面的示例中表现出歧义,但事实并非如此!

它显示不明确的候选编译错误,如果它是无符号长整型,但不显示有符号长整型。

谁能解释为什么!!

#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 funcn";
}
void func(int* ptr) {
cout << "integer pointer overload funcn";
}
int main() {
func(NULL);
return 0;
}

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

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

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

由于NULL可以转换为整数类型,因此它应该在下面的示例中表现出歧义,但事实并非如此!

NULL的问题,这是引入nullptr的动机之一,是你真的不能说它应该如何表现。定义NULL有许多不同的方法,根据定义的选择,这里可能会有不同的行为 - 它可能导致调用模棱两可的两个函数中的任何一个。如果不了解供应商如何定义该宏,就无法说。

nullptr的好处是,毫无疑问,它将int*称为过载。