Разрешение неоднозначности перегруженных функций
От: blacksun  
Дата: 11.06.11 13:30
Оценка:
В MSVC++ 2010 на печать уходит "func1(int)"
Почему??
На основании чего был сделан выбор в пользу int?

#include <iostream>


void func1(long n)
{
    std::cout << "func1(long)" << std::endl;
}

void func1(int n)
{
    std::cout << "func1(int)" << std::endl;
}

int _tmain(int argc, _TCHAR* argv[])
{

    func1(555);
    return 0;
}
Re: Разрешение неоднозначности перегруженных функций
От: const_volatile  
Дата: 11.06.11 14:15
Оценка:
Здравствуйте, blacksun, Вы писали:

B>В MSVC++ 2010 на печать уходит "func1(int)"

B>Почему??
B>На основании чего был сделан выбор в пользу int?

B>
B>void func1(long n)
B>void func1(int n)
B>    func1(555);
B>


тип целочисленного литерала '555' int, поэтому выбирается функция принимающая int. см. стандарт [2.14.2] про тип целочисленных литералов и главу 13 про перегрузки.
Re: Разрешение неоднозначности перегруженных функций
От: wander  
Дата: 11.06.11 14:16
Оценка: 1 (1)
Здравствуйте, blacksun, Вы писали:

B>В MSVC++ 2010 на печать уходит "func1(int)"

B>Почему??
B>На основании чего был сделан выбор в пользу int?

На основании стандарта (2.13.1/2):

The type of an integer literal depends on its form, value, and suffix. If it is decimal and has no suffix, it has the first of these types in which its value can be represented: int, long int; if the value cannot be represented as a long int, the behavior is undefined

Re: Разрешение неоднозначности перегруженных функций
От: VoidEx  
Дата: 11.06.11 14:38
Оценка:
Здравствуйте, blacksun, Вы писали:

B>В MSVC++ 2010 на печать уходит "func1(int)"

B>Почему??
B>На основании чего был сделан выбор в пользу int?

Потому что 555 — int
long — 555L
Re: Разрешение неоднозначности перегруженных функций
От: chijo Россия  
Дата: 01.07.11 07:39
Оценка:
Здравствуйте, blacksun, Вы писали:

B>В MSVC++ 2010 на печать уходит "func1(int)"

B>Почему??
B>На основании чего был сделан выбор в пользу int?

B>
B>#include <iostream>


B>void func1(long n)
B>{
B>    std::cout << "func1(long)" << std::endl;
B>}

B>void func1(int n)
B>{
B>    std::cout << "func1(int)" << std::endl;
B>}

B>int _tmain(int argc, _TCHAR* argv[])
B>{

B>    func1(555);
B>    return 0;
B>}
B>


Все целые числа по стандарту автоматически имеют тип int (long int), если иного явно не указано. Думаю вам еще заодно надо прочитать про explicit и implicit вызовы, а так же про explicit конструкторы, тогда вам все станет понятней...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.