> 백엔드 개발 > C++ > 본문

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

Barbara Streisand
풀어 주다: 2024-11-05 17:45:02
원래의
549명이 탐색했습니다.

Why does `std::forward` disable template argument deduction in Visual Studio 2010?

std::forward에서 템플릿 인수 추론 비활성화

문제 설명

Visual Studio 2010은 std::forward를 다음으로 정의합니다. 템플릿 인수 공제를 비활성화합니다. 의도적으로 비활성화하는 이유는 무엇입니까?

대답

템플릿 인수 추론은 잘못된 유형 결정과 std::forward의 잘못된 동작으로 이어질 수 있습니다. 방법은 다음과 같습니다.

템플릿 인수 추론이 없는 경우

템플릿 인수 추론이 없으면 std::forward는 다음과 같이 정의됩니다.

<code class="cpp">template<class _Ty> inline
_Ty&amp;&amp; forward(typename identity<_Ty>::type&amp; _Arg) {
    return ((_Ty&amp;&amp;)_Arg);
}</code>
로그인 후 복사

템플릿 인수 추론이 있는 경우

std::forward가 템플릿 인수 추론을 사용하는 경우 다음 시나리오가 발생합니다.

  • X 유형의 개체에 대한 rvalue 참조의 경우 (예: func() 또는 7), 템플릿 인수 추론은 T를 X로 올바르게 결정합니다.
  • lvalue 또는 const lvalue(예: 이름이 있는 객체)의 경우 템플릿 인수 추론은 T를 lvalue로 잘못 결정합니다. reference 또는 const lvalue 참조.

잘못된 유형 결정의 의미

완벽한 전달에서 std::forward에 전달된 인수는 lvalue입니다. 템플릿 인수 추론이 활성화된 경우 추론된 유형 T는 lvalue 참조가 됩니다. 그러나 "완벽한 전달"은 rvalue 참조를 의미합니다.

std::forward, static_cast(arg)의 캐스트는 원래 인수가 rvalue인 경우에도 항상 lvalue 참조로 축소됩니다. 이는 잘못된 캐스팅과 완벽한 전달 메커니즘의 오작동으로 이어질 수 있습니다.

다음 코드는 템플릿 인수 추론과 관련된 문제를 보여줍니다.

<code class="cpp">template<typename T>
T&& forward_with_deduction(T&& obj) {
    return static_cast<T&&>(obj);
}

int main() {
    int x;
    int& y = x;
    int&& z = std::move(x);

    forward_with_deduction(7); // Correctly calls forward(int&&)
    forward_with_deduction(y); // Incorrectly calls forward(int&)

    std::forward<int&>(y); // Correctly calls forward(int&)
}</code>
로그인 후 복사

결론

std::forward에서 템플릿 인수 추론을 비활성화하는 것은 완벽한 전달이 올바르게 작동하는 데 중요합니다. 이는 잘못된 유형 결정을 방지하고 rvalue 참조가 rvalue 참조로 올바르게 전달되도록 보장합니다.

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

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