valor tipos salida referencia predefinidas por paso parametros lenguaje funciones entrada ejercicios c++ c++11 overload-resolution universal-reference forwarding-reference

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.