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

Implicit conversion of both operands for operator==

本文关键字:操作数 转换 两个 运算符      更新时间:2023-10-16
即使

未定义相等运算符,以下代码也能编译和执行,没有错误:

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,但不能同时转换为两个操作数。

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

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

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

从标准草案:

[过度匹配] (2.9)

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

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

相关文章: