首頁  >  文章  >  後端開發  >  為什麼「std::forward」在 Visual Studio 2010 中停用範本參數推導?

為什麼「std::forward」在 Visual Studio 2010 中停用範本參數推導?

Barbara Streisand
Barbara Streisand原創
2024-11-05 17:45:02509瀏覽

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

在std::forward 中停用範本參數推導

問題陳述

Visual Studio 2010 將stdforward定義為禁用模板參數推導。為什麼這是故意禁用的?

答案

模板參數推導將導致錯誤的類型確定和 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 類型物件的右值引用(例如,func() 或7),模板參數推導將正確地將T 確定為X。
  • 對於左值或 const 左值(例如,具有名稱的物件),範本參數推導將錯誤地將 T 確定為左值引用或 const 左值參考。

型別確定不正確的效果

在完美轉送中,傳遞給 std::forward 的參數是左值。如果啟用了模板參數推導,則推導類型 T 將是左值引用。然而,「完美轉發」意味著右值引用。

std::forward、static_cast(arg) 中的轉換總是會折疊為左值引用,即使原始參數是右值也是如此。這將導致錯誤的轉換和完美轉發機制的故障。

示例

以下代碼演示了模板參數推導的問題:

<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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn