ฉันเพิ่งเล่นกับ g ++ 4.7 (หนึ่งในสแน็ปช็อตในภายหลัง) ที่เปิดใช้งาน -std = c ++ 11 ฉันพยายามรวบรวมฐานรหัสที่มีอยู่บางส่วนและมีกรณีหนึ่งที่ล้มเหลวค่อนข้างทำให้ฉันสับสน
ฉันจะขอบคุณถ้ามีใครสามารถอธิบายสิ่งที่เกิดขึ้นได้
นี่คือรหัส:
#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;
}
ผมเข้าใจ make_pair ที่มีความหมายที่จะใช้เป็น (1) กรณี (ถ้าฉันระบุประเภทแล้วฉันเช่นกันอาจจะใช้ (3)) แต่ผมไม่เข้าใจว่าทำไมมันล้มเหลวในกรณีนี้
ข้อผิดพลาดที่แน่นอนคือ:
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>&&’
อีกครั้งคำถามคือ "เกิดอะไรขึ้น?" ฉันรู้ว่าฉันสามารถแก้ไขปัญหาได้โดยการลบข้อมูลจำเพาะของเทมเพลต แต่ฉันแค่อยากรู้ว่ามีอะไรล้มเหลวที่นี่
- g ++ 4.4 รวบรวมโค้ดนี้โดยไม่มีปัญหา
- การลบ -std = c ++ 11 ยังคอมไพล์ด้วยโค้ดโดยไม่มีปัญหา
std::vector
โครงสร้างอย่างสิ้นเชิง อย่างน้อยข้อนี้ก็ให้ข้อผิดพลาดของคอมไพเลอร์และไม่ใช่การเปลี่ยนแปลงความหมายแบบไม่โต้ตอบ