문제 설명
Visual Studio 2010은 std::forward를 다음으로 정의합니다. 템플릿 인수 공제를 비활성화합니다. 의도적으로 비활성화하는 이유는 무엇입니까?
대답
템플릿 인수 추론은 잘못된 유형 결정과 std::forward의 잘못된 동작으로 이어질 수 있습니다. 방법은 다음과 같습니다.
템플릿 인수 추론이 없는 경우
템플릿 인수 추론이 없으면 std::forward는 다음과 같이 정의됩니다.
<code class="cpp">template<class _Ty> inline _Ty&& forward(typename identity<_Ty>::type& _Arg) { return ((_Ty&&)_Arg); }</code>
템플릿 인수 추론이 있는 경우
std::forward가 템플릿 인수 추론을 사용하는 경우 다음 시나리오가 발생합니다.
잘못된 유형 결정의 의미
완벽한 전달에서 std::forward에 전달된 인수는 lvalue입니다. 템플릿 인수 추론이 활성화된 경우 추론된 유형 T는 lvalue 참조가 됩니다. 그러나 "완벽한 전달"은 rvalue 참조를 의미합니다.
std::forward, static_cast
예
다음 코드는 템플릿 인수 추론과 관련된 문제를 보여줍니다.
<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 중국어 웹사이트의 기타 관련 기사를 참조하세요!