Çıkarılan getiri değeri dönüştürme operatörleri biraz gariptir. Ancak ana fikir, hangisinin kullanıldığını seçmek için bir işlev parametresi gibi davranmasıdır.
Ve arasındaki karar verirken T&&
ve aşırı yük çözünürlüğü kuralları kazanır. Buna izin vermek için:T&
T&
template<class T>
void f( T&& ) { std::cout << "rvalue"; }
template<class T>
void f( T& ) { std::cout << "lvalue"; }
çalışmak. T&&
bir lvalue ile eşleşebilir, ancak hem lvalue hem de evrensel referans aşırı yükleri mevcut olduğunda lvalue bir tercih edilir.
Doğru dönüşüm operatörleri kümesi muhtemelen:
template <typename T>
operator T&&() &&;
template <typename T>
operator T &() const; // maybe &
ya da
template <typename T>
operator T() &&;
template <typename T>
operator T &() const; // maybe &
başarısız ömür boyu uzantısının sizi ısırmasını önlemek için.
3 Sıralamayı belirlemek için kullanılan türler, kısmi sıralamanın yapıldığı bağlama bağlıdır:
[SNIR]
(3.2) Bir dönüştürme işlevine yapılan çağrı bağlamında, dönüştürme işlevi şablonlarının dönüş türleri kullanılır.
Daha sonra aşırı yükleri seçerken "daha özel" kurallara bağlı olarak sona erer:
(9.1) bağımsız değişken şablonundan tür bir değer değeri başvurusu ise ve parametre şablonundan tür değilse, parametre türünün en azından bağımsız değişken türü kadar uzman olduğu düşünülmez; aksi takdirde,
Dolayısıyla operator T&&
, en azından bu kadar uzman değil operator T&
, bu arada hiçbir kural devleti operator T&
en az onun kadar uzmanlaşmış değildir operator T&&
, bu yüzden operator T&
daha uzmanlaşmıştır operator T&&
.
Daha özel şablonlar, aşırı yük çözünürlüğünü daha azdan kazanır, diğer her şey eşittir.