Почему передача литерального 3 выбирает перегрузку int вместо короткой перегрузки?
Как С++ обрабатывает перегрузку функции в этом случае?
#include <iostream>
void func(int x)
{
std::cout << "integer";
}
void func(short x)
{
std::cout << "short";
}
int main(void)
{
func(3);
}
Вывод: integer
Почему это?
Ответы
Ответ 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);