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

时间:2017-01-24 10:57:58

标签: c++

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

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


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

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

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

1 个答案:

答案 0 :(得分:5)

  

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

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

  

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

从标准草案:

  

[over.match](2.9)

     
      
  • 然后根据所需的隐式转换序列(13.3.3.1)选择最佳可行功能   将每个参数与每个可行函数的相应参数相匹配。
  •   

我强调“每个论点”。不是“一个论点”。