2012-03-16 30 views
6

Đề cập đến trang web này http://www.cplusplus.com/reference/std/utility/make_pair/lý do tại sao std :: make_pair nhận đầu vào theo giá trị thay vì tham chiếu const?

Các std :: make_pair có chữ ký này (và thực hiện càng tốt):

template <class T1,class T2> 
pair<T1,T2> make_pair (T1 x, T2 y) 
{ 
    return (pair<T1,T2>(x,y)); 
} 

Tôi tự hỏi tại sao std :: make_pair có tham số đầu vào theo giá trị và không phải bởi const tài liệu tham khảo?

Có lý do cụ thể nào cho điều này không?

+0

Thú vị http://www.sgi.com/tech/stl/pair.html make_pair lấy đối số theo giá trị, nhưng tiêu chuẩn xác định chúng theo giá trị –

+0

Đó là [tất cả tốt hơn trong C++ 11] (http : //en.cppreference.com/w/cpp/utility/pair/make_pair). Tất cả những lo lắng của bạn là thoáng qua và không liên quan. –

+0

từ cùng một trang "cặp đối tượng có thể được sao chép xây dựng từ các đối tượng cặp khác có chứa các loại khác nhau, nếu các loại tương ứng được chuyển đổi ngầm." – PermanentGuest

Trả lời

6

Ban đầu, lấy tham số theo tham chiếu const, nhưng đã giới thiệu một số sự cố không mong muốn. Nó được thay đổi để vượt qua bởi giá trị sau khi một báo cáo lỗi:

http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#181

Người ta cho rằng trình biên dịch sẽ nội tuyến chức năng và có khả năng tối ưu hóa đi các tham số đi qua hầu hết thời gian.

3

Vì vậy, std::make_pair("abc", 3) sẽ hoạt động. Nếu std::make_pair lấy một tham chiếu, loại suy luận cho T1 sẽ là char const[4], sẽ tạo ra tất cả các loại thông báo lỗi lạ vì nó không thể sao chép được.

Các vấn đề liên quan