在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)"?这有什么促销活动吗?如果是这样,我怎样才能取消促销?
答案 0 :(得分:1)
施放前否定。否定提升为机器大小整数,因此模糊不清。
foo(int16_t(-x));
答案 1 :(得分:1)
您忘记了整数促销。所有算术运算符都对操作数执行整数提升,这些操作数对它们进行了算术运算。
在表达式-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
,但在这种情况下,大概就是你想要做的事情。如果我们使用的是无符号类型,则需要更加小心。