当前位置:  开发笔记 > 编程语言 > 正文

操作符==的两个操作数的隐式转换

如何解决《操作符==的两个操作数的隐式转换》经验,为你挑选了1个好方法。

即使没有定义相等运算符,下面的代码也会编译并执行而不会出现错误:

class A {
public:
    operator bool() const { return true; }
};


int main()
{
    A a, b;
    a == b; //why does this compile?
    return 0;
}

内部发生a == boperator bool() const是为两个操作数调用,然后比较两个布尔值的相等性(这发生在我们的生产代码中,其中class A是一个智能指针类型,并给出了语义上可疑的结果).

我的问题是:在这种情况下,C++标准中的哪些规则允许两个操作数的隐式转换?我可以理解,如果另一个操作数已经是a 而不是两者,那么一个操作数将被隐式转换bool为相等的测试.bool



1> eerorika..:

我可以理解,一个操作数将被隐式转换...,但不能同时转换

那你就误解了.编辑:根据评论中的专家,参数依赖查找似乎是您的假设是正确的情况.但你的不是ADL的情况.

C++标准中的规则允许两个操作数的隐式转换

从标准草案:

[over.match](2.9)

然后,基于将每个参数与每个可行函数的相应参数匹配所需的隐式转换序列(13.3.3.1)来选择最佳可行函数.

我强调"每个论点".不是"一个论点".


@ user2079303:只是为了确保我正确理解你的答案:重载决策将`static bool operator(bool,bool)`视为我的'a == b`比较的候选函数,因为它实际上只是忽略*处的参数类型这个阶段*.在完成候选函数列表之后,编译器确定通过将隐式转换规则应用于类型为"A"的两个变量,可以将它们转换为`bool`,以便`static bool operator(bool,bool) `可以叫?这是发生了什么
推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有