C 영역에서 std::make_pair 함수는 편리한 기능으로 두각을 나타냈습니다. 쌍을 만드는 도구입니다. 그러나 C 11에서 명시적으로 지정된 템플릿 매개변수와 함께 이 기능을 사용하려고 하면 특이한 문제가 발생합니다. 이 기사에서는 이 상황 뒤에 있는 수수께끼의 동작을 자세히 설명합니다.
다음을 고려하세요. 명시적인 템플릿 인수를 사용하여 문자열과 정수 쌍을 생성하려고 시도하는 코드 조각:
std::pair<std::string, int>& b = std::make_pair<std::string, int>(s, 7);
예상된 컴파일 대신 성공하면 다음과 같은 비밀스러운 오류 메시지가 나타납니다.
error: no matching function for call to 'make_pair(std::string&, int)'
이 오류의 원인은 std::make_pair의 잘못된 사용에 있습니다. 이 함수는 제공된 인수를 기반으로 템플릿 매개변수를 추론하도록 설계되었습니다. 이러한 매개변수를 명시적으로 지정하면 추론 프로세스가 방해됩니다.
std::make_pair의 C 11 구현은 T&& 및 U&& 유형의 두 매개변수를 사용합니다. 여기서 T와 U는 템플릿 유형 매개변수입니다. . 문제가 있는 코드에서 볼 수 있듯이 템플릿 인수를 명시적으로 지정하면 인수 추론이 발생하지 않습니다. 대신 지정된 유형이 템플릿 선언으로 직접 대체되어 다음과 같은 결과가 발생합니다.
make_pair(std::string&& argT, int&& argU);
명시적으로 지정된 템플릿의 두 매개 변수는 모두 rvalue입니다. rvalue 표현식에만 바인딩할 수 있는 참조(&&)입니다. 제공된 코드에서 s는 lvalue입니다(임시 값이 아니며 이동되지 않음). 결과적으로 함수 템플릿이 인수와 일치하지 않아 컴파일 오류가 발생합니다.
명시적 템플릿 인수를 생략하면 인수 추론이 발생합니다. 템플릿에 있는 rvalue 참조 매개 변수의 특수한 특성(참조 축소)으로 인해 A&& 유형의 rvalue 참조 매개 변수(A는 템플릿 유형 매개 변수)는 A의 모든 유형에 바인딩될 수 있습니다. A가 lvalue, rvalue, 자격을 갖춘 또는인지 여부 그렇지 않고 A&&가 바인딩될 수 있습니다.
예제 코드에서 s는 std::string 유형의 lvalue이고 7은 int 유형의 rvalue입니다. 컴파일러는 T가 std::string&이고 U가 int라고 추론하여 s와 7이 추론된 매개변수 유형에 성공적으로 바인딩되도록 합니다.
이러한 오류를 방지하려면 다음을 따르세요. 다음 원칙: 함수 인수에서 템플릿 인수를 추론할 수 있는 경우 컴파일러가 추론을 수행하도록 허용합니다. 인수를 명시적으로 제공하는 것은 불필요한 경우가 많으며 예상치 못한 결과가 발생할 수 있습니다. 프로그래머는 인수 추론의 힘을 활용하여 코드를 단순화하고 정확성을 유지하면서 가독성을 높일 수 있습니다.
위 내용은 C 11에서 `std::make_pair`가 명시적 템플릿 인수와 함께 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!