当参数是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)


    推荐阅读