Hãy xem xét các chương trình C++ sauthay đổi Breaking trong C++ 11 với make_pair (_Ty1 && _Val1, const _Ty2 & _Val2)
#include<map>
#include<iostream>
int main() {
int a = 5, b = 7;
auto pair = std::make_pair<int, int>(a,b);
return 0;
}
Sử dụng VC11 và cũng trong gcc-4.7.2 fails với các lỗi khác nhau, mặc dù có vẻ như là có liên quan và VC11 thông báo lỗi là có ý nghĩa hơn
You cannot bind an lvalue to an rvalue
Những gì tôi hiểu từ thất bại này
- VC11 và tôi supp là ose gcc-4.7.2 chỉ thực hiện một lệnh std :: make_pair
make_pair(_Ty1&& _Val1, const _Ty2& _Val2)
chỉ có thể chấp nhận tham chiếu rvalue. Trước khi VC++ phiên bản ví dụ VC10 có hai phiên bản, một để chấp nhận một giá trị trái và một tài liệu tham khảo một rvalue - rvalue tài liệu tham khảo không thể được sử dụng để khởi tạo một tham chiếu const phi nghĩa
int & a = b * 5
không hợp lệ. - tôi có thể đã sử dụng
std::move
để chuyển đổilvalue
-rvalue
tài liệu tham khảo và các cuộc gọi sẽ thành công. - Như
std::make_pair
chấp nhận hai loại khác nhau cho mỗi người trong số các thông số, Mẫu Đối số Nghị quyết trong mọi trường hợp có thể có thể giải quyết các loại tham số và một cách rõ ràng xác định kiểu là không cần thiết.
Kịch bản này có vẻ tầm thường và không tương thích có thể dễ dàng được giải quyết bằng cách loại bỏ các loại đặc tả rõ ràng và đưa ra định nghĩa như
auto pair = std::make_pair(a,b);
- Bây giờ, câu hỏi của tôi là, yếu tố lái xe để loại bỏ là những gì việc thực hiện lvalue từ thư viện?
- Có thể biết bất kỳ chức năng thư viện khác mà đã được thay đổi theo những cách tương tự?
- Làm thế nào để xử lý các tình huống khi tôi cần phải nhắm mục tiêu nhiều trình biên dịch như g ++, CC, ACC, XL C++ nơi một trong hai trình biên dịch chưa được nâng cấp hoặc trình biên dịch không hỗ trợ các tài liệu tham khảo rvalue và hay di chuyển ngữ nghĩa.
Vâng, nó không phải là một thay đổi phá vỡ, bởi vì những người trên trái đất sử dụng 'std :: make_pair' với instantiation mẫu rõ ràng? Nó được thiết kế rõ ràng * để thu lợi nhuận từ khấu trừ loại tự động. Vì vậy, vì hiếm khi ai cũng viết 'std :: make_pair' để ủng hộ 'std :: make_pair', không có nhiều mã bị phá vỡ. Vâng, tốt đẹp, mặc dù. –
Thật không may, tôi đã gặp phải mã nơi loại rõ ràng đã được chỉ định. – Abhijit
Tôi tin rằng đây là vấn đề tương tự được thảo luận tại [http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43785](http://gcc.gnu.org/bugzilla/show_bug.cgi? id = 43785) – Nevin