[英]Type deduction for default constructor with defaulted template type
假設我有以下示例類型:
template < class T = void > struct Test { };
template < > struct Test<void> { };
以及此類型推導指南:
template<class T> Test() -> Test<T>;
以下編譯就可以了:
Test f;
在GCC上。
但是,在Clang上。 推導指南必須是:
template<class T = void> Test() -> Test<T>;
所以我的問題是: 哪個是正確的?
默認模板類型應同時存在於推導類型和基本類型中,還是僅存在於基本類型中,並假定它將由編譯器選擇。
使用-O3 -std=c++17
在godbolt.org上測試了GCC和Clang的主干版本
首先,鑒於類模板參數已默認設置,因此您實際上不需要此類型的推導指南。 如果您提供推論指南,則應為:
Test() -> Test<void>;
使其成為推導指南模板沒有任何意義。
就是說,我認為這不是任何編譯器的錯誤。 編寫包含未推導的模板參數的推導指南並沒有錯 ,如您的示例所示:
template<class T> Test() -> Test<T>;
但是,盡管標准允許該構造,但實際執行也沒有任何意義。 演繹指南的重點是...演繹指南。 如果您提供不可推論的扣除指南,那有什么意義? 此處的Clang錯誤似乎對我很有幫助-它在提醒您您編寫的代碼明顯錯誤的事實。
如果我們正在做學問,那就是lang蟲。 但是實際上,我比ccc更喜歡clang的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.