C++ 否定和重载决议

C++ negation and overload resolution

在微软Visual Studio2015中,如下代码:

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)

这是怎么回事?不应该是"argument types are: (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 但在这种情况下,这大概是您想要做的。如果我们使用无符号类型,您需要更加小心。