Неоднозначность перегрузки при передаче 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-значения. Так почему же это не скомпилировать?