考虑这个例子:
struct A{
template<class T>
operator T(); // #1
};
struct B:A{
template<class U>
operator U&&(); // #2
};
int main(){
B b;
int a = b; // #3
b.operator int(); // #4
}
根据 [class.member.lookup] p7
如果 N 是非依赖的转换函数 ID,则考虑作为 T 成员的转换函数模板。
S(t,T)
对于每个这样的模板 F,构造查找集,认为函数模板声明t
只有在它对应于 F 的声明([basic.scope.scope])时才具有名称。每个这样的查找集的声明集的成员不应是无效集,并包含在结果中。
#1
和都包含在查找结果中#2
,而不管转换函数 ID#3
和#4
. 的诊断是#3
我们所期望的,换句话说,两者#1
都是#2
候选者,并且它们是无法区分的。
但是,似乎实现仅#2
在处理时将其视为唯一候选者#4
。如上所述,候选集对于#3
或应该是相同的#4
。我是否省略了其他一些导致差异的规则?或者,它是实现中的错误吗?
实现只是没有赶上新的(明确的)规则,这些规则必须在 2020 年大量发明,因为没有发布的标准版本曾经以任何合理的方式描述了转换函数模板的查找。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句