Tôi chỉ đang chơi với g ++ 4.7 (một trong những ảnh chụp nhanh sau này) với -std = c ++ 11 được bật. 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 khiến tôi hơi bối rối.
Tôi sẽ đánh giá cao nếu ai đó có thể giải thích những gì đang xảy ra.
Đây là mã:
#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 được có nghĩa là để đượ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ó thất bại trong trường hợp này.
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<class _T1, class _T2> constexpr std::pair<typename std::__decay_and_strip<_T1>::__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<char>}’) to type ‘std::basic_string<char>&&’
Một lần nữa, câu hỏi ở đây chỉ là "chuyện gì đang xảy ra?" Tôi biết rằng tôi có thể khắc phục sự cố bằng cách xóa đặc tả mẫu, nhưng tôi chỉ muốn biết điều gì đang xảy ra ở đây.
- g ++ 4.4 biên dịch mã này mà không có vấn đề gì.
- Loại bỏ -std = c ++ 11 cũng biên dịch bằng mã mà không có vấn đề gì.
std::vector
xây dựng . Ít nhất điều này gây ra lỗi trình biên dịch và không phải là sự thay đổi âm thầm trong ngữ nghĩa.