帶有初始值設定項列表的函數中的類型推導
考慮函數模板:
此函數需要一個帶有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中文網其他相關文章!