c++ - type - vector pair pair




make_pair(_Ty1 &&_Val1, const_Ty2 &_Val2)를 사용하여 C++ 11의 변경 사항 (2)

std::make_pair<int, int> 를 수행하면 템플리트 인수 T1T2 를 모두 int 로 추론합니다. 이것은 std::pair<int,int> make_pair(int&&, int&&) 와 같은 함수를 제공합니다. 이제 이러한 인수는 rvalue 참조이기 때문에 rvalues ​​만 사용할 수 있습니다.

그러나 T1T2 의 유형이 템플릿 유형 공제에 의해 추론되는 경우, 이들은 "범용 참조"의 역할을합니다. 즉, lvalue 인수를 받으면 lvalue 참조가되고 rvalue 인수가 있으면 rvalue 참조가됩니다. 이렇게하면 make_pair 에게 완벽한 전달 기능을 제공합니다.

그래서 요점은 명시 적으로 템플릿 유형 인수를 제공하지 않는다는 것입니다. make_pair 의 전체적인 점은 유형 자체를 추론한다는 것입니다. 유형의 이름을 지정하면 더 이상 완벽하게 전달할 수 없으며 lvalue 인수에 실패합니다.

다음 C ++ 프로그램을 고려하십시오.

#include<map>
#include<iostream>
int main() {
    int a = 5, b = 7;
    auto pair = std::make_pair<int, int>(a,b);
    return 0;
    }

VC11과 gcc-4.7.2를 사용하면 다른 오류로 인해 실패 하지만 관련성이 있고 VC11 오류 메시지가 더 의미가 있습니다.

You cannot bind an lvalue to an rvalue   

이 실패로 내가 아는 것은

  1. VC11 그리고 gcc-4.7.2에는 rvalue 참조 만 받아 들일 수있는 std :: make_pair make_pair(_Ty1&& _Val1, const _Ty2& _Val2) 구현이 하나 있다고 가정합니다. 이전 VC ++ 버전 예제 VC10에는 두 가지 버전이 있습니다. 하나는 왼쪽 값을, 다른 하나는 rvalue 참조를 허용합니다.
  2. Rvalue 참조는 비 const 참조를 초기화하는 데 사용할 수 없습니다. 즉 int & a = b * 5 는 유효하지 않습니다.
  3. std::move 를 사용하여 lvaluervalue reference로 변환하면 호출이 성공할 수 있습니다.
  4. std::make_pair 는 각 매개 변수에 대해 두 가지 유형을 허용하기 때문에 모든 가능한 경우 템플리트 인수 해결은 매개 변수 유형을 해석 할 수 있으며 유형을 명시 적으로 지정하는 것은 필요하지 않습니다.

이 시나리오는 사소한 것으로 보이며 명시 적 유형 지정을 제거하고 다음과 같이 정의를 작성하면 쉽게 비 호환성을 해결할 수 있습니다.

auto pair = std::make_pair(a,b);
  • 자, 내 질문은, lvalue 구현 라이브러리에서 제거하려면 운전 요인은 무엇입니까?
  • 유사한 방식으로 변경된 다른 라이브러리 함수를 아는 것이 가능합니까?
  • g ++, CC, aCC, XL C ++과 같은 여러 컴파일러를 대상으로 할 때 이러한 상황을 처리하는 방법 컴파일러가 업그레이드되지 않았거나 컴파일러가 rvalue 참조를 지원하지 않거나 의미를 이동하지 않는 경우

std::make_pair 는 유형 공명을 이용하여 유형의 이름을 입력하는 것을 피하기 위해 존재합니다. 그래서 과부하가 하나 뿐인 이유입니다. VC가 생각하는 것처럼 보편적 인 참조 가 하나도없고 lvalue 참조가 아닌 일반적인 참조 가 두 개 있어야합니다.

template <class T1, class T2>
constexpr pair<V1, V2> make_pair(T1&& x, T2&& y);

형식을 명시 적으로 입력하려면 쌍 생성자 만 사용할 수 있습니다. 그것은 더 짧다 ...

auto pair = std::pair<int, int>(a,b);




g++