Os operadores de conversão de valor de retorno deduzido são um pouco estranhos. Mas a ideia central é que ele funcione como um parâmetro de função para escolher qual deles é usado.
E ao decidir entre T&&
e T&
as T&
vitórias nas regras de resolução de sobrecarga. Isso é para permitir:
template<class T>
void f( T&& ) { std::cout << "rvalue"; }
template<class T>
void f( T& ) { std::cout << "lvalue"; }
trabalhar. T&&
pode corresponder a um lvalue, mas quando as sobrecargas de referência lvalue e universal estão disponíveis, o lvalue é o preferido.
O conjunto certo de operadores de conversão é provavelmente:
template <typename T>
operator T&&() &&;
template <typename T>
operator T &() const; // maybe &
ou mesmo
template <typename T>
operator T() &&;
template <typename T>
operator T &() const; // maybe &
para impedir que a extensão da vida útil com falha o morda.
3 Os tipos usados para determinar a ordem dependem do contexto em que a ordem parcial é feita:
[RECORTE]
(3.2) No contexto de uma chamada para uma função de conversão, são usados os tipos de retorno dos modelos de função de conversão.
O que acaba dependendo das regras "mais especializadas" ao selecionar sobrecargas:
(9.1) se o tipo do gabarito de argumento era uma referência lvalue e o tipo do gabarito de parâmetro não era, o tipo de parâmetro não é considerado pelo menos tão especializado quanto o tipo de argumento; de outra forma,
Portanto, operator T&&
não é pelo menos tão especializado quanto operator T&
, enquanto nenhum estado de regra operator T&
não é pelo menos tão especializado quanto operator T&&
, portanto, operator T&
é mais especializado que operator T&&
.
Modelos mais especializados ganham menos que a resolução de sobrecarga, sendo tudo o resto igual.