問題陳述
Visual Studio 2010 將stdforward定義為禁用模板參數推導。為什麼這是故意禁用的?
答案
模板參數推導將導致錯誤的類型確定和 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 的參數是左值。如果啟用了模板參數推導,則推導類型 T 將是左值引用。然而,「完美轉發」意味著右值引用。
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 中停用模板參數推導對於完美轉送的正確運作至關重要。它可以防止錯誤的類型確定,並確保右值引用作為右值引用正確轉發。
以上是為什麼「std::forward」在 Visual Studio 2010 中停用範本參數推導?的詳細內容。更多資訊請關注PHP中文網其他相關文章!