C++否定和重载解析



在Microsoft Visual Studio 2015中,以下代码:

void foo(int8_t a);
void foo(int16_t a);
void foo(int16_t a, int16_t b);
void f()
{
    int8_t x /* = some value */;
    foo(-int16_t(x)); // ERROR
}

给出以下消息:

foo
Error: more than one instance of overloaded function "function" matches the argument list:
    function "foo(int8_t a)"
    function "foo(int16_t a)"
    argument types are: (int)

这是怎么回事?它不应该说"参数类型是:(int16_t)"吗?这和升职有关系吗?如果是,我该如何关闭促销?

在投射之前进行否定运算。取反会提升为机器大小的整数,因此会产生歧义。

foo(int16_t(-x));

您忘记了整数促销。所有算术运算符都对正在进行算术运算的操作数执行整数提升。

在表达式-a中,对于任何a整数提升应用于a。这样做的效果是,如果a是比int窄的整数类型,则该值将提升为int

在您的系统中,int是32位的,因此int16_t较窄,因此-(int16_t)x表示-(int)(int16_t)x

如果你想以16位精度求反:你不能;您必须以int精度进行操作,然后将结果转换回16位。

在这种情况下,foo( (int16_t)-x )是最简单的方法,尽管通常要想想你否定了什么。这里-x-(int)x,但在这种情况下,这可能是你想要做的。如果我们使用无符号类型,你需要更加小心。

最新更新