作者:洛丽塔珊珊_668 | 来源:互联网 | 2022-12-08 10:23
Gcc编译好了,但是Clang(trunk)拒绝了这个消息:
https://godbolt.org/g/h8rsWC
template
struct S{};
template
struct S { };
这段代码是否正确?
1> T.C...:
这只会在-std=c++17
以后出现."更专业"的确定需要从类模板合成一对函数模板,合成模板参数的唯一类型,值和模板,最后在两个方向上执行模板参数推导.如果演绎在一个方向上成功而在另一个方向上不成功,则模板"更专业化".
在这里,Clang T
从两个来源推断并获得不同的结果:
从明确指定int&
,它推断T := int&
.
根据非类型参数x
,它T := int
按照通常的演绎规则(通常不推导出引用类型)推导出来.在C++ 17中添加了从非类型模板参数的类型推导出的这种能力.
这使得演绎在两个方向都失败,因此部分专业化未能通过"更专业化"的测试.
这看起来像标准中的缺陷.解决方法是T
将原始模板包装在非推导的上下文中.