首頁 >後端開發 >C++ >為什麼 `printme({\'a\', \'b\', \'c\'});` 在 C 範本類型推導中非法?

為什麼 `printme({\'a\', \'b\', \'c\'});` 在 C 範本類型推導中非法?

Patricia Arquette
Patricia Arquette原創
2024-12-02 20:24:14419瀏覽

Why is `printme({'a', 'b', 'c'});` Illegal in C   Template Type Deduction?

帶有初始值設定項列表的函數中的類型推導

考慮函數模板:

此函數需要一個帶有begin 的類型的參數() 和結束()

問題:

為什麼下面的呼叫是非法的?

答案:

呼叫printme({'a', 'b', 'c'}) 是非法的,因為無法推斷模板參數T 。如果不明確指定模板參數,編譯器無法確定參數的類型,因為它可以是具有 begin() 和 end() 函數的任何類型。在下列情況下不會出現此問題:

  • 明確範本參數規格:printme>({'a', 'b', 'c'})
  • 帶型別推導的參數型別: printme(std::vector({'a', 'b', 'c'}))
  • 使用auto 推導型別: const auto il = {'a', 'b', 'c'}; printme(il);
  • 明確指定模板參數: printme<:initializer_list>>({'a', 'b', 'c'})

例外的是 auto 被推導為 std::initializer_list,這與從模板參數推導。此行為在 C 11 標準 (§ 14.8.2.5/5) 中明確指定,該標準規定,不會推導作為初始化器列表但不是 std::initializer_list 類型的函數形參的模板實參。然而,標準的§ 7.1.6.4/6 明確支持 auto 推導 std::initializer_list.

以上是為什麼 `printme({\'a\', \'b\', \'c\'});` 在 C 範本類型推導中非法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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