首頁 >後端開發 >C++ >為什麼 C 中的初始化列表模板推導失敗?

為什麼 C 中的初始化列表模板推導失敗?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-29 16:39:09642瀏覽

Why Does Template Deduction Fail with Initializer Lists in C  ?

模板推導與初始化列表

考慮以下函數:

template<typename T>
void printme(T&& t) {
  for (auto i : t)
    std::cout << i;
}

此函數採用帶有begin()/end 的單一參數( ) 啟用類型。但是,以下程式碼片段被認為是非法的:

printme({'a', 'b', 'c'});

儘管使用向量、字串、陣列和明確初始化列表的類似程式碼可以正常運作。問題來了,為什麼這個特定的片段是非法的?

理解這個問題的關鍵在於模板參數推導。在這種情況下,無法推導模板參數 T。為了修正這個問題,必須明確指定模板參數,如下所示:

printme<vector<char>>({'a', 'b', 'c'})
printme<initializer_list<char>>({'a', 'b', 'c'})

在上述程式碼合法的片段中,參數擁有明確定義的類型,允許使用模板參數 T可以無縫推斷。使用 auto 還可以使函數正常工作,因為它推斷類型為 std::initializer_list

但是,在比較範本參數推導和 auto 關鍵字時,會出現奇怪的行為。雖然 auto 將型別推斷為 std::initializer_list,但模板參數推導卻不然。這是因為C 11 標準明確指出,當函數參數是初始值設定項列表,但參數沒有std::initializer_list 或對可能cv 限定的std 的引用時,這是模板參數的非推導上下文::initializer_list 類型。

儘管如此,auto 關鍵字特別支援 std::initializer_list,允許程式碼運行正確。

以上是為什麼 C 中的初始化列表模板推導失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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