Operator konversi nilai kembalian yang disimpulkan agak aneh. Tetapi ide intinya adalah bahwa ia bertindak seperti parameter fungsi untuk memilih yang mana yang digunakan.
Dan ketika memutuskan antara T&&
dan T&
yang T&
menang dalam aturan resolusi overload. Ini untuk mengizinkan:
template<class T>
void f( T&& ) { std::cout << "rvalue"; }
template<class T>
void f( T& ) { std::cout << "lvalue"; }
bekerja. T&&
dapat cocok dengan nilai lv, tetapi ketika nilai lv dan referensi universal kelebihan tersedia, nilai l lebih disukai.
Operator konversi yang tepat mungkin:
template <typename T>
operator T&&() &&;
template <typename T>
operator T &() const; // maybe &
atau bahkan
template <typename T>
operator T() &&;
template <typename T>
operator T &() const; // maybe &
untuk mencegah perpanjangan seumur hidup yang gagal menggigit Anda.
3 Jenis yang digunakan untuk menentukan pemesanan tergantung pada konteks di mana pemesanan parsial dilakukan:
[MENGGUNTING]
(3.2) Dalam konteks panggilan ke fungsi konversi, tipe pengembalian dari templat fungsi konversi digunakan.
Yang akhirnya tergantung pada aturan "lebih khusus" ketika mengambil kelebihan:
(9.1) jika tipe dari template argumen adalah referensi lvalue dan tipe dari template parameter tidak, tipe parameter tidak dianggap paling khusus sebagai tipe argumen; jika tidak,
Dengan demikian operator T&&
tidak setidaknya sama terspesialisasi operator T&
, sementara tidak ada negara aturan operator T&
tidak setidaknya sama terspesialisasi operator T&&
, jadi operator T&
lebih khusus daripada operator T&&
.
Template yang lebih khusus memenangkan resolusi kelebihan lebih dari yang lebih sedikit, yang lainnya dianggap sama.