Sobrecarregue a ambiguidade ao passar o valor-R para a função que usa o valor-L

Eu tenho 2 funções sobrecarregadas - uma recebe um valor L e a outra recebe um valor-R. O objetivo é que a função possa ser chamada assim:

Obj obj;
foo(obj);

OU:

foo(Obj());

Então, eu escrevo 2 funções sobrecarregadas:

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));
}

A sobrecarga de valor R precisa apenas delegar para a sobrecarga de valor-L. Do jeito que eu entendo, uma vez que estou no corpo da função, qualquer uso dev me dá uma referência de valor L, a menos que eu use especificamentestd::move oustd::forward. Então chamandofoo(v) dentro da sobrecarga de valor R deve chamar automaticamente a versão de valor L (em vez de recursing).

Mas o compilador reclama da ambigüidade:

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

Eu não entendo porque isso é ambíguo. A chamada parafoo() dentro da sobrecarga do valor-R deve chamar claramente a versão do valor-L. Então, por que isso não compila?

questionAnswers(1)

yourAnswerToTheQuestion