运算符== 的两个操作数的隐式转换
Implicit conversion of both operands for operator==
即使
未定义相等运算符,以下代码也能编译和执行,没有错误:
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) 选择最佳可行函数将每个参数与每个可行函数的相应参数匹配。
我强调"每个论点"。不是"一个论点"。
相关文章:
- 错误 C2679:二进制"<<":未找到采用类型 'std::string_view' 的右侧操作数的运算符(或者没有可接受的转换)
- C2678 二进制 '==':未找到采用 'Card' 类型左操作数的运算符(或者没有可接受的转换)
- 二进制 '==':未找到采用 'Enemy' 类型左侧操作数的运算符(或者没有可接受的转换)
- QTextStream的操作数到二进制的转换无效
- 如何将字符串转换为可操作数组
- 错误 C2679:二进制'<<':找不到采用类型 'overloaded-function' 的右侧操作数的运算符(或者没有可接受的转换)
- 错误:C2679 二进制"==":未找到采用类型 'const std::string' 的右侧操作数的运算符(或者没有可接受的转换)
- 是任务的正确操作数总是转换为rvalue
- 错误 C2678:二进制"+":未找到采用类型 'volatile A' 的左侧操作数的运算符(或者没有可接受的转换)
- 错误 C2679:二进制"<<":未找到采用类型 'mystring' 的右侧操作数的运算符(或者没有可接受的转换)
- 错误 C2679:二进制'>':找不到采用类型 'int' 的右侧操作数的运算符(或者没有可接受的转换)
- 错误 C2679 二进制"=":未找到采用类型 'int' 的右侧操作数的运算符(或者没有可接受的转换)
- 错误 C2679 二进制"=":未找到采用类型 'int' 的右侧操作数的运算符(或者没有可接受的转换)
- 放置 new 的返回值与其操作数的强制转换值之间是否存在(语义)差异
- 运算符== 的两个操作数的隐式转换
- 视觉C 在操作数中向标准运算符中的隐式转换
- C2679:二进制"<<":未找到采用类型为"student"的右操作数的运算符(或没有可接受的转换)
- 错误 C2678:'=='二进制:未找到采用类型 'CSchemaString' 的左操作数的运算符(或者没有可接受的转换)
- C/C++ 中的 'if' 语句是否将操作数转换为整数?
- 错误:将' double* '和' double '类型的操作数转换为二进制' operator/ '无效