簡體   English   中英

具有默認模板類型的默認構造函數的類型推導

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM