C ++否定和重载决策

时间:2016-03-27 06:57:16

标签: c++ integer-promotion

在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)"?这有什么促销活动吗?如果是这样,我怎样才能取消促销?

2 个答案:

答案 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,但在这种情况下,大概就是你想要做的事情。如果我们使用的是无符号类型,则需要更加小心。