将"unsigned char"传递给需要 char 或 const char* 的重载函数会导致歧义

Passing an "unsigned char" to an overloaded function expecting either char or const char* results in ambiguity

本文关键字:char 重载 函数 歧义 unsigned const      更新时间:2023-10-16

我使用QByteArray来存储原始二进制数据。为了存储数据,我使用QByteArray的append函数。

我喜欢使用无符号字符来表示字节,因为我认为255-1更容易解释。然而,当我尝试将零值字节附加到QByteArray时,如下所示:

command.append( (unsigned char) 0x00));

编译器向CCD_ 6抱怨。据我所知,这是因为零可以被解释为空指针,但为什么编译器不将无符号字符视为字符,而不是怀疑它是否是const字符*?当然,如果编译器抱怨command.append(0)没有任何强制转换,我会理解的。

两个重载都需要类型转换——一个从unsigned char转换为char,另一个从unsigned char转换为const char *。编译器并不试图判断哪一个更好,它只是告诉你让它显式。如果其中一个是完全匹配的,它将被使用:

command.append( (char) 0x00));

unsigned charchar是两种不同但可转换的类型。unsigned charconst char *也是两种不同的类型,在这种特定情况下也是可转换的。这意味着两个重载函数都不能与参数完全匹配,但在这两种情况下,参数都可以转换为参数类型。从语言角度来看,这两个函数同样适合调用。因此产生了歧义。

您似乎认为unsigned char版本应该被视为"更好"的匹配。但语言与你不一致。

的确,在这种情况下,歧义源于(unsigned char) 0x00是有效的空指针常数这一事实。你可以通过引入中间变量来解决这个问题

unsigned char c = 0x0;
command.append(c);

c不符合空指针常数的条件,这消除了歧义。尽管如此,正如@David Rodríguez-dribeas在评论中指出的那样,您可以通过将零设置为char而不是unsigned char来消除歧义。