繁体   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