Да, они могут быть перегружены на основании ссылки или нет. Вот почему прекрасно, когда они так сосуществуют; они разные.
Проблема связана с двусмысленностью. В то время как f(1)
может быть вызван только для одного варианта, f(i)
может быть вызван для обоих вариантов. Ни один из них не является предпочтительным, поэтому вы получаете ошибку из-за неоднозначности. Если вы добавили третью функцию, foo (const int&)
, все вызовы будут неоднозначными. Но все они по-прежнему перегружены друг другом и не противоречат друг другу.
Я согласен, что странно иметь три перегрузки функции и напрямую не вызывать ни одной. Возможно, кто-то еще может добавить.