Почему эти две функции неоднозначны, хотя их искаженные имена разные [дубликаты]

Рассмотрим следующие определения функций:

void fun(int& a)
{
    cout << "Ra" << endl;
}

А также:

void fun(int a)
{
    cout << "a" << endl;
}

Теперь, когда я вызываю функцию следующим образом:

int a;
fun(a);

Вызов неоднозначен, поскольку компилятор не может решить, следует ли вызывать по значению или по ссылке.

Мой вопрос:

Когда я пишу что-то вроде этого:

int a;
int &b = a;
fun(b);

Это снова дает двусмысленность. Поскольку b является ссылкой, почему бы не вызвать тот, где аргумент является ссылкой.

Я уже видел ответы на этот вопрос: Перегрузка функции на основе значения по сравнению с Const Reference, но это не отвечает на мой вопрос. Пожалуйста помоги.


person tapananand    schedule 15.11.2014    source источник
comment
Кстати: Почему вы используете int& b в своем примере? Совершенно лишнее.   -  person Deduplicator    schedule 15.11.2014
comment
@Deduplicator: я использую int&, чтобы понять, почему компилятор позволяет создавать функции как int, так и int&. Как мы можем назвать их каким-либо образом, не создавая двусмысленности.   -  person tapananand    schedule 15.11.2014
comment
Прочитайте все ответы на дубликат, этого должно быть достаточно. Кстати: есть также приведение к xvalue.   -  person Deduplicator    schedule 15.11.2014
comment
Дубликат отвечает на часть моих сомнений: как мы можем назвать эталонную версию. Но почему передача b в качестве аргумента дает здесь двусмысленность?   -  person tapananand    schedule 15.11.2014
comment
Поскольку b является lvalue типа int. И обе функции одинаково хорошо подходят для этого. (Считайте это не ссылкой, а просто псевдонимом — другим именем — для a. Почти во всех случаях это так. (Исключение для decltype.))   -  person Deduplicator    schedule 15.11.2014