2016-03-27 2 views
0

В Microsoft Visual Studio 2015, следующий код:C++ отрицания и перегрузка разрешение

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

Отрицание целого числа преобразует его в 'int'. Какое преобразование вы хотите (преобразование типа и отрицание)? –

+0

Я не могу подписать расширение «x» к 16-битовому целому, возьмите дополнение 2 к этому, а затем передайте его в foo (int16_t a) И я верю int 32-бит на моем компьютере, так почему в мире есть отрицание 16-битного целого числа 32-битного целого? – Isaac

+0

Откажитесь, прежде чем бросать. Отрицание продвигается до 32-битного целого. –

ответ

1

Отклонить перед тем, как сделать бросок. Отрицание продвигается к целому числу размеров машины, следовательно, двусмысленность.

foo(int16_t(-x)); 
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, но в этом случае это, по-видимому, то, что вы действительно хотите сделать. Если бы мы использовали неподписанные типы, вам нужно было проявлять большую осторожность.

Смежные вопросы