làm cách nào để chuyển giá trị l sang std :: make_pair
Trong std::make_pair
chỉ có một triển khai C ++ 14 trở đi
template <class T1, class T2> constexpr std :: pair <V1, V2> make_pair (T1 && t, T2 && u);
Cả hai tham số đều là tham chiếu giá trị R và theo điều này
Các tham chiếu giá trị R không thể được khởi tạo bằng giá trị l.
int i = 1;
char ch = 'a';
std::unordered_map<int, char> mp;
mp.insert(make_pair<int,char>(i, ch));
Vì vậy, khi tôi cố gắng sử dụng make_pair như trong đoạn mã trên, nó sẽ phát ra lỗi một cách chính xác error: cannot bind rvalue reference of type 'int&&' to lvalue of type 'int'
.
Tuy nhiên, nó hoạt động hoàn hảo cho đoạn mã trên nếu tôi thay đổi, thả các đối số mẫu và gọi nó là
mp.insert(make_pair(i, ch));
Tôi bối rối về cách hoạt động của điều này i
và ch
cả hai đều là giá trị L. Độ phân giải đối số mẫu có chuyển đổi giá trị L thành giá trị R hay như cách này hoạt động không?
Trả lời
Các tham số của make_pair
không được khai báo là tham chiếu giá trị, mà là tham chiếu chuyển tiếp .
Tham chiếu chuyển tiếp là một loại tham chiếu đặc biệt bảo toàn loại giá trị của một đối số hàm, làm cho nó có thể chuyển tiếp nó bằng phương thức std :: forward. Các tham chiếu chuyển tiếp là:
- tham số chức năng của mẫu hàm được khai báo là tham chiếu giá trị đến tham số mẫu loại không đủ tiêu chuẩn cv của cùng mẫu hàm đó:
Chuyển tiếp tham chiếu hoạt động với cả giá trị và giá trị, với sự trợ giúp của suy luận đối số mẫu . Khi được chuyển một giá trị, tham số mẫu sẽ được suy ra là tham chiếu giá trị, sau khi thu gọn tham chiếu, tham số hàm cũng là tham chiếu giá trị. Khi truyền một giá trị, tham số mẫu sẽ được coi là không tham chiếu, tham số hàm là rvalue-tham chiếu.
Mặt khác, nếu bạn chỉ định rõ ràng đối số mẫu make_pair<int,char>(...)
, tham số hàm sẽ trở thành tham chiếu rvalue tương ứng.
Câu trả lời của songyuanyao đã giải thích hầu hết những gì đang xảy ra. Tuy nhiên, tôi muốn đóng góp cách làm cho điều này hoạt động với các đối số mẫu rõ ràng. Bạn đã đi gần hết con đường đến đó, nhưng không thực hiện bước cuối cùng.
Tôi bối rối về cách hoạt động của điều này
i
vàch
cả hai đều là giá trị L.
Chính xác. Bạn muốn các giá trị l, là thứ bạn có thể chỉ định trong các đối số mẫu:
std::make_pair<int &, char &>(i, ch)
hoặc một biểu mẫu hoạt động trong nhiều trường hợp hơn:
std::make_pair<const int &, const char &>(i, ch)
Một chút viết thêm, nhưng cần thiết nếu suy luận đối số không thành công vì một số lý do.