나는 -std = c ++ 11이 활성화 된 상태에서 g ++ 4.7 (나중 스냅 샷 중 하나)을 가지고 놀았습니다. 기존 코드베이스의 일부를 컴파일하려고했는데 실패한 경우가 다소 혼란 스러웠습니다.
누군가가 무슨 일이 일어나고 있는지 설명해 주시면 감사하겠습니다.
코드는 다음과 같습니다.
#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
와 유사합니다 . 적어도 이것은 컴파일러 오류를 생성하고 의미 체계의 자동 변경이 아닙니다.