c++ - 具有默认模板类型的默认构造函数的类型推导
问题描述
假设我有这个示例类型:
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
解决方案
首先,您实际上并不需要这种类型的推导指南——因为类模板参数已经被默认了。如果您确实提供了扣除指南,则应该是:
Test() -> Test<void>;
把它做成一个扣减指南模板是没有意义的。
也就是说,我认为这不是一个错误......来自任何一个编译器。编写具有非推导模板参数的推导指南没有任何问题,就像您的示例一样:
template<class T> Test() -> Test<T>;
但是,虽然标准允许这种结构,但实际上也没有任何意义。推演指南的重点是……引导推演。如果您提供不可扣除的扣除指南,那有什么意义?此处的 Clang 错误似乎对我很有帮助 - 它提醒您注意您编写的代码显然是错误的。
如果我们是迂腐的,clang bug。但实际上,我更喜欢 clang 的结果而不是 gcc 的结果。
推荐阅读
- git - 现有的 git repo 不再被识别为有效的存储库
- batch-file - 使用扫描所有端口的paping.exe批量端口扫描工具
- java - dependency injection (CDI) in java EE 8
- node.js - 在 Dialogflow 响应中显示 BasicCard
- c# - 通过 asp.net 连接到 mysql 数据库
- python - 为什么 pytest-qt 找不到 Python 3.4 的 PyQt?
- javascript - document.body.appendChild(scriptElement) 之后功能不可用
- c# - 如何显示排序列表中的键(仅)?
- sql - Oracle中查询的IN语句中每个值如何只获取5行
- sql - 如何链接两个表,但只从 PostgreSQL 中的一个表中获取 MAX 值?