Los operadores de conversión de valor de retorno deducidos son un poco extraños. Pero la idea central es que actúa como un parámetro de función para elegir cuál se usa.
Y al decidir entre T&&
y T&
las T&
victorias en las reglas de resolución de sobrecarga. Esto es para permitir:
template<class T>
void f( T&& ) { std::cout << "rvalue"; }
template<class T>
void f( T& ) { std::cout << "lvalue"; }
trabajar. T&&
puede coincidir con un valor, pero cuando están disponibles las sobrecargas de referencia universal y de valor, se prefiere el valor.
El conjunto correcto de operadores de conversión es probablemente:
template <typename T>
operator T&&() &&;
template <typename T>
operator T &() const; // maybe &
o incluso
template <typename T>
operator T() &&;
template <typename T>
operator T &() const; // maybe &
para evitar que una extensión fallida de por vida te muerda.
3 Los tipos utilizados para determinar el orden dependen del contexto en el que se realiza el orden parcial:
[RECORTE]
(3.2) En el contexto de una llamada a una función de conversión, se utilizan los tipos de retorno de las plantillas de la función de conversión.
Que luego termina dependiendo de las reglas "más especializadas" al elegir sobrecargas:
(9.1) si el tipo de la plantilla de argumento era una referencia de valor y el tipo de la plantilla de parámetro no lo era, el tipo de parámetro no se considera al menos tan especializado como el tipo de argumento; de otra manera,
Por operator T&&
lo tanto, no es al menos tan especializado como operator T&
, mientras que ningún estado de regla operator T&
no es al menos tan especializado como operator T&&
, por lo que operator T&
es más especializado que operator T&&
.
Más plantillas especializadas ganan resolución de sobrecarga por menos, todo lo demás es igual.