繁体   English   中英

转换function的显式调用和隐式调用有什么区别?

[英]What's the difference between an explicit call and an implicit call of the conversion function?

考虑这个例子:

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 成员的转换 function 模板。 对于每个这样的模板 F,构造查找集S(t,T) ,考虑 function 模板声明只有当它对应于 F 的声明([basic.scope.scope])时才具有名称t 结果中包括每个此类查找集的声明集的成员,这些成员不应是无效集。

#1#2都包含在查找结果中,而不管#3#4中的conversion-function-id是什么。 #3诊断是我们所期望的,换句话说, #1#2都是候选者,并且无法区分。

但是,在处理#4时,实现似乎只将#2视为唯一候选者。 如上所述, #3#4的候选集应该相同。 我是否忽略了其他一些导致差异的规则? 或者,它是实现中的错误吗?

实施只是没有跟上新的(已澄清的)规则,这些规则必须在 2020 年大量发明,因为没有发布的标准版本以任何合理的方式描述转换 function 模板的查找。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM