Przeciążenie niejednoznaczności podczas przekazywania wartości R do funkcji, która przyjmuje wartość L

Mam 2 przeciążone funkcje - jedna pobiera wartość L, a druga przyjmuje wartość R. Celem jest, aby funkcja mogła być nazwana tak:

Obj obj;
foo(obj);

LUB:

foo(Obj());

Więc piszę 2 przeciążone funkcje:

template <class T>
void foo(T& v)
{
  /* ... function body code goes here ... */
}

template <class T>
void foo(T&& v)
{
    foo(v);
}

int main()
{
    foo(int(5));
}

Przeciążenie wartości R wystarczy przekazać do przeciążenia wartości L. Sposób, w jaki to rozumiem, gdy już jestem w ciele funkcji, każde użyciev daje mi odniesienie do wartości L, chyba że specjalnie używamstd::move lubstd::forward. Więc dzwonięfoo(v) w przeciążeniu R-value należy automatycznie wywołać wersję L-value (zamiast rekurencji).

Ale kompilator skarży się na niejednoznaczność:

test.cpp: In function ‘void foo(T&&) [with T = int]’:
test.cpp:305:12:   instantiated from here
test.cpp:299:2: error: call of overloaded ‘foo(int&)’ is ambiguous

Nie rozumiem, dlaczego to jest niejednoznaczne. Wezwanie dofoo() w przeciążeniu R-value należy wyraźnie nazwać wersję L-value. Dlaczego więc tego nie kompiluje?

questionAnswers(1)

yourAnswerToTheQuestion