将 NULL 转换为长不是模棱两可吗?
Casting NULL to long is not ambigious?
我正在尝试一个关于 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*
称为过载。
相关文章:
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 如何在 c++ 中'NULL'字符串
- c++使用foreach使数组为null
- 当使用通配符和null指针调用函数时,对输出的说明
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 如何在映射中返回null
- "Inverse SFINAE"避免模棱两可的过载
- 操作员C++的模棱两可的过载
- 模棱两可的重载模板
- 为什么返回 NULL 不会破坏函数?
- 构造函数中的 QQuickItem 父项 null
- 调用重载的"<大括号括起来的初始值设定项列表>"对于对来说就足够了是模棱两可的
- 检查字符串是否"null" C++
- fopen 在 gdb 中返回 NULL
- what(): basic_string::_M_construct null not valid
- 在这个函数中是有缺陷的,因为取消引用 null 是无效的,所以我想更改代码
- 为什么在排序链表上的这种合并实现总是将两个列表都设置为 NULL,而只有一个应该设置一个列表?
- 为什么要从main()返回NULL?
- 为什么 nlohmann/json 序列化 "null" 而不是在 double 上"0"?
- 将 NULL 转换为长不是模棱两可吗?