当参数是0的时候C++是怎样区分的这两个函数的
作为 C++ 从 C 里继承来的规则,0 具有双重身份:整型字面量(integer literal)空指针常量(null pointer constant)以 整型字面量 身份出现的 0 的类型为 int。(见 C++11 §2.14.2/2)而 空指针常量 则要复杂些: 【当参数是0的时候C++是怎样区分的这两个函数的】 A null pointer constant is an integral constant expression prvalue of integer type that evaluates tozero or a prvalue of type std::nullptr_t. A null pointer constant can be converted to a pointer type; theresult is the null pointer value of that type and is distinguishable from every other value of object pointer orfunction pointer type. Such a conversion is called a null pointer conversion.
以上出自 C++11 §4.10/1,歌词大意是:值为 0 的表达式是空指针常量类型是 std::nullptr_t 的纯右值也是空指针常量空指针常量需要进行一次转换,才能转换为相应的指针类型的「空指针值」所以如果有这样的代码:void foo(int); // (1)void foo(int *); // (2)foo(0);
如果想匹配 (1):0 作为整型字面量,本身就是 int如果想匹配 (2):0 作为空指针常量,需要先进行一次类型转换,才能变成 int *你看,不用类型转换 vs 需要类型转换,高下立判,直接选择 (1)。如果题目中的「Byte」是「uint8_t」的话,理论上是没法通过编译的,因为如果想匹配 uint8_t 的话:0 作为整型字面量,本身是 int,需要先进行一次类型转换,才能变成 uint8_t如果想匹配 uint8_t * 的话:0 作为空指针常量,需要先进行一次类型转换,才能变成 uint8_t *需要类型转换 vs 需要类型转换,存在歧义。
■网友
用C++11写就好了setByte(nullptr); // void setByte(Byte *Value)
至于直接传0,在我的编译器里,也会调用``setByte(Byte *Value)``,相信是为了保持向上兼容,因为旧代码中就是用0来代表NULL。要想它调用``setByte(Byte value)``,只要这样明确地指定它的类型就可以了setByte(Byte(0)); // void setByte(Byte Value)
推荐阅读
- 栖霞山@正是栖霞山赏枫好时候 栖霞丹枫似火若霞
- 非计算机专业想要利用课余时间深入自学C++,想要找到比较体面的工作大概需要啥水平
- 想寒假的时候一个月在家准备计算机二级的office高级应用,但是不知道买啥书比较好~~~?
- 环球车讯网|终于等到了,奥德赛跌至21.98万元,是时候入手了
- Java工程师和C++工程师在工作上有啥区别哪个更适合自身发展
- 读书读到3分之一的时候感觉很难理解,要不要继续
- 方程|高考数学坐标系与参数方程知识点总结!速速收藏!
- 汽车|国产SUV鏖战 为什么说“大心脏”的能获胜?参数不玩虚的丨动力之强 数据说话基因不是盖的丨沃尔沃同款发动机,豪横调教得是精的丨成熟的手法
- 销量|考验品牌力的时候到了,三缸雷凌开启预售,销量是增还是减?
- 考研的时候通过啥渠道获得自己需要的信息