首頁 > 後端開發 > C++ > 為什麼 C 11 中的明確模板參數會導致 `std::make_pair` 失敗?

為什麼 C 11 中的明確模板參數會導致 `std::make_pair` 失敗?

Mary-Kate Olsen
發布: 2025-01-05 02:03:40
原創
481 人瀏覽過

Why Does `std::make_pair` Fail with Explicit Template Arguments in C  11?

用顯式模板參數解開謎題:std::make_pair 難題

在C 領域,std::make_pair 函數作為一種方便的函數已經嶄露頭角。用於創建對的工具。然而,當嘗試在 C 11 中使用明確指定的模板參數使用此函數時,會出現一個特殊問題。本文深入研究了這種情況背後的神秘行為。

手邊的錯誤

考慮以下內容嘗試使用明確模板參數建立一對字串和整數的程式碼片段:

std::pair<std::string, int>& b = std::make_pair<std::string, int>(s, 7);
登入後複製

而不是預期的編譯成功,出現神祕錯誤訊息:

error: no matching function for call to 'make_pair(std::string&, int)'
登入後複製

揭開謎底

此錯誤的根源在於std::make_pair 的錯誤使用。該函數旨在根據提供的參數推斷模板參數。顯式聲明這些參數會阻礙此推理過程。

幕後花絮

std::make_pair 的 C 11 實作採用 T&& 和 U&& 類型的兩個參數,其中 T 和 U 是範本類型參數。當明確指定模板參數時,如有問題的程式碼所示,不會發生參數推導。相反,指定的類型會直接替換到模板聲明中,從而產生以下結果:

make_pair(std::string&& argT, int&& argU);
登入後複製

右值引用的關鍵作用

請注意,明確指定模板中的兩個參數都是右值引用(&&),只能綁定到右值表達式。在提供的程式碼中, s 是一個左值(不是臨時的且未被移動)。因此,函數模板無法匹配參數,從而導致編譯錯誤。

為什麼沒有明確參數也能運作

當省略顯式模板參數時,會發生參數推導。由於模板中右值引用參數的特殊性(引用折疊),A&&類型的右值引用參數(其中A是模板類型參數)可以綁定到A的任何類型。無論A是左值、右值、限定或不是,A&& 可以綁定到它。

在範例程式碼中,s 是 std::string 類型的左值,7 是 int 類型的右值。編譯器將 T 推斷為 std::string&,將 U 推斷為 int,從而允許 s 和 7 成功綁定到推斷的參數類型。

結論

要避免此類錯誤,請遵守遵循以下原則:如果可以從函數參數推導出模板參數,則允許編譯器執行推導。明確提供參數通常是不必要的,並且可能會導致意想不到的結果。透過利用參數推導的力量,程式設計師可以簡化程式碼並增強其可讀性,同時保持其正確性。

以上是為什麼 C 11 中的明確模板參數會導致 `std::make_pair` 失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板