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