[lib.pairs] 8 pair
는 "명시 적 유형"make_pair
의 동안 "형식을 사용하는 표준 상태 추론된다 ". 당신이 C++03 compiler에서 코드를 실행하면
template <class T1, class T2>
pair(const T1& x, const T2& y)
가이 오류가 발생합니다 : : 표준이 pair
에 대한 생성자를 정의하는 이유
이다
non-static reference member int& std::pair<int&, int&>::first
, can't use default assignment operator
문제는 pair
은을 사용한다는 것입니다 implicitly-declared copy assignment operator은 다음 경우에 정의되지 않습니다. pair
:
Has a non-static data member of a reference type
make_pair
또는 pair
생성자로 정의되는지 여부에 관계없이 템플릿 인수는 pair
의 구성원을 모두 int&
으로 정의하므로 암시 적으로 선언 된 복사본 할당 연산자가 정의되지 않습니다. C++ 03에서는 pair
으로이 작업을 수행 할 수 없습니다.tie
의 사용 반환 매개 변수가 바람직하지 않은 경우
, 당신이 쓸 수있는 자신의 구현 : 이것은 pair
의 할당 수
template <class T1, class T2>
struct tie{
T1& first;
T2& second;
tie(T1& x, T2& y) : first(x), second(y) {}
tie<T1, T2>& operator=(const pair<T1, T2>& rhs){
first = rhs.first;
second = rhs.second;
return *this;
}
};
:
tie<int, int>(a, b) = test();
정확한 C를 얻으려면를 ++ 템플릿 인자를 필요로하지 않는 함수는 함수를 정의해야합니다. 이 단지 C++ 11로 pair
의 할당을 허용
template <class T1, class T2>
details::tie<T1, T2> tie(T1& x, T2& y) {
return details::tie<T1, T2>(x, y);
}
: tie
이 namespace details
에 중첩되어있는 경우 함수는 다음과 같이 정의 할 수 있습니다
tie(a, b) = test();
Live Example
참고 여전히 int&
템플릿 인수를 사용하는 것을 용납하지 않으므로 details::tie<int&, int&>
및 tie<int&, int&>
은 이전과 마찬가지로 실패합니다.
나는 이것을하기 위해 당신이 말한 것을 검증했습니다. ' foo = make_pair (a, b)'오류가 있습니다 : "std :: pair '에서 비 스칼라 타입'std :: pair '로의 변환 요청"그래서 분명히 맞지만 이것이 왜 더 복잡한 지 자세히 설명해 주시겠습니까? 'make_pair'가 레퍼런스 타입을 그냥 떼어 내고 있다면 왜 템플릿 인자로 전달할 수 있습니까? –
'make_pair'에 템플릿 매개 변수를 제공하지 않아도됩니다. 당신이 할 수있는 것은 (이 경우 불행한) 언어 의미론의 효과에 불과합니다. * 왜 * 가는가? 그것은 참조가 아닌 독립형 값을 만들기 위해 설계 되었기 때문입니다. 특정 구현에 대해 잘 모르겠습니다. C++ 2003 표준을 사용하면 더 좋은 설명을 줄 수 없습니다. – krzaq