首頁 > 後端開發 > C++ > 為什麼在 C 11 的 `std::make_pair` 中明確指定模板參數無法編譯?

為什麼在 C 11 的 `std::make_pair` 中明確指定模板參數無法編譯?

Mary-Kate Olsen
發布: 2025-01-01 12:49:11
原創
987 人瀏覽過

Why Does Explicitly Specifying Template Parameters in C  11's `std::make_pair` Fail to Compile?

指定模板參數的C 11 make_pair 無法編譯

Q:

在g 4.7 中使用嘗試使用具有明確指定模板參數的std::make_pair 函數編譯程式碼失敗。目標是了解此錯誤的原因。

A:

make_pair 的錯誤用法

std::make_pair用於自動模板參數推導。明確指定模板參數可防止這種推導,從而導致實際參數類型和預期參數類型之間不匹配。函數採用T&& 和U&& 類型的參數,其中T 和U 是模板型參數,實際上類似:

template<typename T, typename U>
make_pair(T&& argT, U&& argU);
登入後複製

參數型別差異

指定模板參數時明確地,沒有發生參數推導。相反,在函數模板中直接使用指定的類型,結果是:

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

在這種情況下,兩個參數類型都是右值引用,只能綁定到右值。但是,參數之一 s 是左值(現有物件),這使其與預期的右值參考類型不相容。因此,函數模板無法匹配提供的參數,從而導致編譯錯誤。

make_pair 的正確用法

要解決此問題,請刪除明確模板參數規格並允許自動推論參數。在這種情況下,編譯器可以將 T 推導為 std::string,因為 s 是 std::string 類型的左值,從而導致 std::string& 作為最終參數類型。類似地,U 被推導為 int,參數 7 是 int 類型的右值,結果是 int&&。這些參數類型與函數模板正確匹配,從而可以成功編譯。

模板通用指南

對於模板,通常建議讓編譯器執行模板參數推導只要有可能。僅在絕對必要時才應明確指定模板參數。

以上是為什麼在 C 11 的 `std::make_pair` 中明確指定模板參數無法編譯?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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