> 백엔드 개발 > C++ > `std::make_pair`에 템플릿 매개변수를 명시적으로 지정하면 C 11에서 컴파일 오류가 발생하는 이유는 무엇입니까?

`std::make_pair`에 템플릿 매개변수를 명시적으로 지정하면 C 11에서 컴파일 오류가 발생하는 이유는 무엇입니까?

Susan Sarandon
풀어 주다: 2024-12-13 01:54:16
원래의
974명이 탐색했습니다.

Why Does Explicitly Specifying Template Parameters in `std::make_pair` Cause Compilation Errors in C  11?

C 11에서 템플릿 매개변수를 명시적으로 지정할 때 std::make_pair를 컴파일할 수 없음

C 11에서 std::make_pair는 rvalue에 대한 참조인 두 개의 인수를 사용합니다( T&& 및 U&&). 그러나 호출 중에 템플릿 매개 변수를 명시적으로 지정하면 인수 추론이 방지되어 함수 템플릿 선언 내에서 rvalue 참조가 대체됩니다. lvalue 인수가 rvalue 참조에 바인딩될 수 없는 이러한 불일치로 인해 컴파일 오류가 발생합니다.

컴파일 오류의 근본 원인

명시적으로 제공된 템플릿 인수(예: std)와 함께 std::make_pair를 사용하려고 시도 ::make_pair())로 인해 예상되는 rvalue 참조와 실제 lvalue 인수가 일치하지 않습니다. (std::string).

템플릿에서 Rvalue 참조의 역할

템플릿의 Rvalue 참조 매개변수는 템플릿 유형 매개변수의 모든 인스턴스에 바인딩할 수 있는 고유한 기능을 보유합니다. lvalue, rvalue 또는 정규화된 값.

템플릿 매개변수가 생략된 컴파일러 동작

std::make_pair 호출 중에 템플릿 인수가 생략되고 템플릿 인수 공제가 발생합니다. 컴파일러는 제공된 인수(이 경우 std::string 및 int)에서 템플릿 유형을 추론합니다. rvalue 참조 매개변수(T&& 및 U&&)는 각각 std::string& 및 int&&로 추론됩니다. T에 대한 결과 템플릿 인수가 축소되어 추가 참조가 제거되고 lvalue 인수(std::string)에 대한 바인딩이 허용됩니다.

솔루션 및 모범 사례

이러한 오류를 방지하려면 필요한 경우가 아니면 std::make_pair에 대한 템플릿 인수를 명시적으로 지정합니다. 컴파일러가 일반적으로 원하는 동작으로 이어지는 인수 추론을 수행하도록 허용합니다. 예상치 못한 결과가 발생하는 경우 명확한 컴파일 오류가 문제를 정확히 파악하는 데 도움이 됩니다.

위 내용은 `std::make_pair`에 템플릿 매개변수를 명시적으로 지정하면 C 11에서 컴파일 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿