> 백엔드 개발 > C++ > `std::forward`가 템플릿 인수 추론을 비활성화하는 이유는 무엇입니까?

`std::forward`가 템플릿 인수 추론을 비활성화하는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-11-12 22:47:02
원래의
298명이 탐색했습니다.

Why does `std::forward` disable template argument deduction?

std::forward를 사용하여 템플릿 인수 추론을 비활성화

std::forward를 사용하여 템플릿 인수 추론을 비활성화하는 이유는 무엇입니까?

특정에서는 std::forward 함수 구현(예: VS2010)은 ID라는 템플릿 메타 함수를 사용하여 템플릿 인수 추론을 허용하지 않습니다. 이는 lvalue 참조 및 const lvalue 참조와 관련된 상황에서 std::forward의 동작을 정밀하게 제어하기 위해 수행됩니다.

템플릿 인수 추론 사용의 의미

If std::forward가 템플릿 인수 추론을 활용했다면 입력 인수 유형을 기반으로 템플릿 매개변수(T)를 추론하게 됩니다. 이 동작은 입력 인수가 lvalue 또는 const lvalue(예: 이름이 있는 변수)인 경우 문제가 됩니다. 이러한 경우 템플릿 인수 추론은 T를 lvalue 참조 또는 const lvalue 참조로 잘못 추론하여 잘못된 유형 캐스팅으로 이어집니다.

다음 예를 고려하세요.

<code class="cpp">template<typename T>
T&& forward_with_deduction(T&& obj)
{
    return static_cast<T&&>(obj);
}</code>
로그인 후 복사

명명된 변수를 전달할 때 또는 상수를 forward_with_deduction에 적용하면 lvalue 참조 또는 const lvalue 참조로 잘못 해석되어 T가 그렇게 추론됩니다. 결과적으로 static_cast 작업은 범용 참조(T&&)에 대한 기대에도 불구하고 유형을 lvalue 참조 또는 const lvalue 참조로 축소합니다.

예:

<code class="cpp">int x;
int&& z = std::move(x);

// Incorrectly deduces T to be int& and casts z as int&
forward_with_deduction(z); // calls test(int&) instead of test(int&&)</code>
로그인 후 복사

std::forward의 해결

올바른 확인을 위해 모든 경우에 인수를 캐스팅하면 std::forward는 ID 메타함수를 사용합니다. ID는 컴파일러가 템플릿 매개변수를 추론하지 못하도록 방지하는 자리 표시 유형으로 작동합니다. 결과적으로 std::forward는 실제 유형에 관계없이 항상 입력 인수를 범용 참조로 해석합니다.

입력 인수를 범용 참조로 캐스팅함으로써 std::forward는 객체의 완벽한 전달을 가능하게 합니다. lvalue 또는 const lvalue인 경우에도 마찬가지입니다. 이 동작은 전달된 인수의 유형이 전달 프로세스 전반에 걸쳐 범용 참조로 유지되도록 보장합니다.

위 내용은 `std::forward`가 템플릿 인수 추론을 비활성화하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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