Các toán tử chuyển đổi giá trị trả về được suy ra là một chút lạ. Nhưng ý tưởng cốt lõi là nó hoạt động như một tham số chức năng để chọn cái nào được sử dụng.
Và khi quyết định giữa T&&
và T&
các T&
chiến thắng trong các quy tắc giải quyết tình trạng quá tải. Đây là để cho phép:
template<class T>
void f( T&& ) { std::cout << "rvalue"; }
template<class T>
void f( T& ) { std::cout << "lvalue"; }
làm việc. T&&
có thể phù hợp với một giá trị, nhưng khi cả hai giá trị quá tải tham chiếu phổ biến và giá trị đều có sẵn, thì giá trị lvalue được ưu tiên.
Tập hợp đúng của các toán tử chuyển đổi có thể là:
template <typename T>
operator T&&() &&;
template <typename T>
operator T &() const; // maybe &
hoặc thậm chí
template <typename T>
operator T() &&;
template <typename T>
operator T &() const; // maybe &
để ngăn chặn sự mở rộng suốt đời không cắn bạn.
3 Các loại được sử dụng để xác định thứ tự phụ thuộc vào ngữ cảnh trong đó việc đặt hàng một phần được thực hiện:
[SNIP]
(3.2) Trong ngữ cảnh của lệnh gọi hàm chuyển đổi, các kiểu trả về của các mẫu hàm chuyển đổi được sử dụng.
Mà sau đó kết thúc tùy thuộc vào quy tắc "chuyên biệt hơn" khi chọn quá tải:
(9.1) nếu loại từ mẫu đối số là tham chiếu giá trị và loại từ mẫu tham số thì không, loại tham số không được coi là ít nhất là chuyên biệt như loại đối số; nếu không thì,
Do đó, operator T&&
ít nhất là không chuyên biệt như operator T&
trong khi đó, không có trạng thái quy tắc nào operator T&
ít nhất là chuyên biệt như operator T&&
vậy, vì vậy operator T&
nó chuyên biệt hơn operator T&&
.
Các mẫu chuyên dụng hơn giành được độ phân giải quá tải hơn ít hơn, mọi thứ khác đều bằng nhau.