std::forward에서 템플릿 인수 추론 비활성화
질문:
왜 템플릿인가요? Visual Studio 2010에서 std::forward 구현 시 인수 추론이 비활성화되어 있습니까?
답변:
std::forward는 완벽한 전달에 사용되는 유틸리티 함수입니다. 입력 인수의 유형은 출력 인수에 유지됩니다. 그러나 std::forward에서 템플릿 인수 추론이 활성화된 경우 특정 시나리오에서 잘못된 동작이 발생할 수 있습니다.
구체적으로 입력 인수가 lvalue 또는 const lvalue(예: 이름이 있는 객체)인 경우 ), 템플릿 인수 추론은 매개변수 유형을 lvalue 또는 const lvalue 참조로 추론합니다. 완벽한 전달 시나리오에서는 입력 인수의 정확한 유형을 유지하는 것이 목표이므로 이는 바람직하지 않습니다.
잠재적인 문제를 설명하려면 다음을 수행하세요.
<code class="cpp">template<typename T> void test(T&& obj) { // ... } int main() { int x; int& y = x; test(7); // input is an rvalue, so T is deduced as int&& test(x); // input is an lvalue, so T is deduced as int& test(y); // input is a named lvalue, so T is deduced as int& }</code>
여기서 예를 들어, std::forward가 템플릿 인수 추론을 사용한 경우 test(x) 및 test(y)의 인수 유형이 int&로 잘못 추론되어 예기치 않은 동작이 발생합니다.
이 문제를 방지하려면, std::forward 구현에서는 ID 메타함수를 사용하여 유형 매개변수를 명시적으로 지정하고 템플릿 인수 추론을 효과적으로 비활성화합니다. 이렇게 하면 입력 인수의 유형이 rvalue인지 lvalue인지에 관계없이 출력 인수에 유지됩니다.
위 내용은 Visual Studio 2010의 std::forward에서 템플릿 인수 추론이 비활성화되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!