Подтвердить что ты не робот

Почему передача литерального 3 выбирает перегрузку int вместо короткой перегрузки?

Как С++ обрабатывает перегрузку функции в этом случае?

#include <iostream>

void func(int x)
{
   std::cout << "integer";
}

void func(short x)
{
   std::cout << "short";
}

int main(void)
{
   func(3);
}

Вывод: integer

Почему это?

4b9b3361

Ответ 1

У констант тоже есть типы. И без суффикса указать иначе, 3 является просто константой int. Компилятор выберет более крупный тип, если константа слишком велика, но по умолчанию это будет меньше, чем int.

Теперь так получилось, что нет суффикса, чтобы сделать короткую константу. Вам нужно будет добавить бросок, если вы хотите, чтобы эта конкретная перегрузка была вызвана.

Ответ 2

Литерал 3 является константой и неявно имеет тип int по дизайну языка.

Для выполнения вашей short перегруженной функции вы должны использовать short переменную:

short s = 3;
fun(s);

или приведите константу правильно:

fun((short)3);
fun(static_cast<short>(3));

Тип short не имеет суффикса, например long (long l = 42L;), но вы можете создать его.

Ответ 3

Потому что 3 - целое число.

fun(static_cast<short>(3));

будет вызывать короткую версию.

Или вы можете использовать пользовательские литералы, чтобы сделать короткое: см. здесь

Ответ 4

Вы делаете

fun(3);

и 3 - литеральная константа целое число, поэтому функция, которая лучше соответствует перегрузке, - это

void fun(int x)
{
    std::cout << "integer";
}

не стесняйтесь играть в литте с типами и бросать таких, как:

fun(short(3));
fun(int(3));
// C++11
auto x = 3;
fun(x);

Ответ 5

Константа 3 имеет собственный тип, в этом случае она int. Вам нужно явно указать константу на short, если вы хотите, чтобы ваша перегрузка выполнялась

fun((short)3);