Tôi chỉ đang phát xung quanh với g ++ 4.7 (một trong những ảnh chụp nhanh sau) đã bật -std = C++ 11. Tôi đã cố gắng biên dịch một số cơ sở mã hiện có của mình và một trường hợp không thành công gây nhầm lẫn cho tôi.C++ 11 make_pair với các tham số mẫu được chỉ định không biên dịch
Tôi sẽ đánh giá cao nếu ai đó có thể giải thích những gì đang diễn ra.
Dưới đây là đoạn code
#include <utility>
#include <iostream>
#include <vector>
#include <string>
int main ()
{
std::string s = "abc";
// 1 ok
std::pair < std::string, int > a = std::make_pair (s, 7);
// 2 error on the next line
std::pair < std::string, int > b = std::make_pair < std::string, int > (s, 7);
// 3 ok
std::pair < std::string, int > d = std::pair < std::string, int > (s, 7);
return 0;
}
Tôi hiểu make_pair đó là nghĩa được sử dụng như là (1) trường hợp (nếu tôi chỉ định các loại, sau đó tôi cũng có thể sử dụng (3)), Nhưng Tôi không hiểu tại sao nó lại thất bại trong trường hợp này.
Các lỗi chính xác là:
test.cpp: In function ‘int main()’: test.cpp:11:83: error: no matching function for call to ‘make_pair(std::string&, int)’ test.cpp:11:83: note: candidate is: In file included from /gcc4.7/usr/local/lib/gcc/i686-pc-linux-gnu/4.7.0/../../../../include/c++/4.7.0/utility:72:0, from test.cpp:1: /gcc4.7/usr/local/lib/gcc/i686-pc-linux-gnu/4.7.0/../../../../include/c++/4.7.0/bits/stl_pair.h:274:5: note: template constexpr std::pair::__type, typename std::__decay_and_strip<_T2>::__type> std::make_pair(_T1&&, _T2&&) /gcc4.7/usr/local/lib/gcc/i686-pc-linux-gnu/4.7.0/../../../../include/c++/4.7.0/bits/stl_pair.h:274:5: note: template argument deduction/substitution failed: test.cpp:11:83: note: cannot convert ‘s’ (type ‘std::string {aka std::basic_string}’) to type ‘std::basic_string&&’
Một lần nữa, câu hỏi ở đây chỉ là "những gì đang xảy ra?" Tôi biết rằng tôi có thể khắc phục vấn đề bằng cách loại bỏ đặc tả mẫu, nhưng tôi chỉ muốn biết những gì đang thất bại ở đây dưới trang bìa. Cảm ơn trước.
EDIT:
- g ++ 4.4 biên dịch mã này không có vấn đề.
- Xóa -std = C++ 11 cũng biên dịch bằng mã không có sự cố.
Một câu hỏi tuyệt vời. Tuy nhiên, một ví dụ khác về sự thay đổi phá vỡ tinh tế trong C++ 11, tương tự như [thay đổi đột phá trong 'std :: vector' construction] (http://stackoverflow.com/questions/5759232/stdvector-default-construction-c11- và đột phá). Ít nhất điều này mang lại một lỗi trình biên dịch và không phải là một sự thay đổi thầm lặng trong ngữ nghĩa. –
Nếu tôi có biến số nguyên i. Tôi muốn ghép đôi với tôi và một vật thể khác. Làm thế nào chính xác tôi nên gọi là tuyệt vọng. 1) make_pair <*i, obj> 2) int && j = i; make_pair? Cả hai đều không hoạt động. Whats cách chính xác để làm điều đó? –
PHcoDer