首页 > 解决方案 > 具有默认模板类型的默认构造函数的类型推导

问题描述

假设我有这个示例类型:

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>;

所以我的问题是:哪个是正确的?

默认模板类型应该同时存在于推导和基本类型中,还是只存在于基本类型中,并假设它会被编译器拾取。

GCC 和 Clang 的主干版本都使用 godbolt.org 进行了测试-O3 -std=c++17

标签: c++templatesg++c++17clang++

解决方案


首先,您实际上并不需要这种类型的推导指南——因为类模板参数已经被默认了。如果您确实提供了扣除指南,则应该是:

Test() -> Test<void>;

把它做成一个扣减指南模板是没有意义的。


也就是说,我认为这不是一个错误......来自任何一个编译器。编写具有非推导模板参数的推导指南没有任何问题,就像您的示例一样:

template<class T> Test() -> Test<T>;

但是,虽然标准允许这种结构,但实际上也没有任何意义。推演指南的重点是……引导推演。如果您提供不可扣除的扣除指南,那有什么意义?此处的 Clang 错误似乎对我很有帮助 - 它提醒您注意您编写的代码显然是错误的。

如果我们是迂腐的,clang bug。但实际上,我更喜欢 clang 的结果而不是 gcc 的结果。


推荐阅读