c++ - tipos - ¿Un argumento lvalue prefiere un parámetro de referencia lvalue sobre una referencia universal?
parametros por valor y por referencia java (1)
Mientras jugaba con referencias universales, encontré esta instancia en la que clang y gcc no están de acuerdo con la resolución de sobrecarga.
#include <iostream>
struct foo {};
template<typename T>
void bar(T&) { std::cout << "void bar(T&)/n"; }
template<typename T>
void bar(T&&) { std::cout << "void bar(T&&)/n"; }
int main()
{
foo f;
bar(f); // ambiguous on gcc, ok on clang
}
gcc informa que la llamada de arriba es ambigua. Sin embargo, clang selecciona la T&
sobrecarga y compila con éxito.
¿Qué compilador está mal y por qué?
Editar:
Probó el mismo código en la Vista previa de VS2013, y está de acuerdo con Clang; excepto Intellisense, que está del lado de gcc :-)
La "referencia universal" deduce el parámetro a foo&
. La primera plantilla también deduce el parámetro a foo&
.
C ++ tiene una regla de orden parcial para las plantillas de función que hace que T&
sea más especializado que T&&
. Por lo tanto, la primera plantilla debe ser elegida en su código de ejemplo.