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?