Неоднозначность перегрузки при передаче R-значения в функцию, которая принимает L-значение

У меня есть 2 перегруженные функции - одна принимает L-значение, а другая принимает R-значение. Цель состоит в том, чтобы функция могла быть вызвана как:

Obj obj;
foo(obj);

ИЛИ ЖЕ:

foo(Obj());

Итак, я пишу 2 перегруженные функции:

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

Перегрузка R-значения просто должна делегироваться перегрузке L-значения. Как я понимаю, когда я нахожусь в теле функции, любое использованиеv дает мне ссылку на L-значение, если я специально не используюstd::move или жеstd::forward, Так зоветfoo(v) в пределах перегрузки R-значения следует автоматически вызывать версию L-значения (а не повторять).

Но компилятор жалуется на неоднозначность:

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

Я не понимаю, почему это неоднозначно. Призыв кfoo() в пределах перегрузки R-значения следует четко назвать версию L-значения. Так почему же это не скомпилировать?

Ответы на вопрос(1)

Ваш ответ на вопрос