làm cách nào để chuyển giá trị l sang std :: make_pair

Aug 16 2020

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 ichcả 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

3 songyuanyao Aug 16 2020 at 08:06

Các tham số của make_pairkhô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à:

  1. 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.

1 JaMiT Aug 16 2020 at 11:01

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 ichcả 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.