В 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)»? У этого есть что-то с продвижением? если да, то как я могу отключить рекламу?
Отрицание целого числа преобразует его в 'int'. Какое преобразование вы хотите (преобразование типа и отрицание)? –
Я не могу подписать расширение «x» к 16-битовому целому, возьмите дополнение 2 к этому, а затем передайте его в foo (int16_t a) И я верю int 32-бит на моем компьютере, так почему в мире есть отрицание 16-битного целого числа 32-битного целого? – Isaac
Откажитесь, прежде чем бросать. Отрицание продвигается до 32-битного целого. –