我正在尝试使用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两者都有效.
由于
NULL可以将其转换为整数类型,因此下面的示例应该显示模糊性,但它不是!!
问题NULL,这是引入的动机之一nullptr,是你真的不能说它应该如何表现.有许多不同的方法NULL可以定义,并且根据定义的选择,你可能在这里有不同的行为 - 它可能导致后面的两个函数中的任何一个被调用或模糊不清.您不能不知道您的供应商如何定义该宏.
好消息nullptr是它毫无疑问会调用int*重载.
| 归档时间: |
|
| 查看次数: |
215 次 |
| 最近记录: |