即使没有定义相等运算符,下面的代码也会编译并执行而不会出现错误:
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++标准中的哪些规则允许两个操作数的隐式转换?我可以理解,如果另一个操作数已经是a 而不是两者,那么一个操作数将被隐式转换bool
为相等的测试.bool
我可以理解,一个操作数将被隐式转换...,但不能同时转换
那你就误解了.编辑:根据评论中的专家,参数依赖查找似乎是您的假设是正确的情况.但你的不是ADL的情况.
C++标准中的规则允许两个操作数的隐式转换
从标准草案:
[over.match](2.9)
然后,基于将每个参数与每个可行函数的相应参数匹配所需的隐式转换序列(13.3.3.1)来选择最佳可行函数.
我强调"每个论点".不是"一个论点".