即使没有定义相等运算符,下面的代码也会编译并执行而不会出现错误:
class A {
public:
operator bool() const { return true; }
};
int main()
{
A a, b;
a == b; //why does this compile?
return 0;
}
Run Code Online (Sandbox Code Playgroud)
内部发生a == b
的operator bool() const
是为两个操作数调用,然后比较两个布尔值的相等性(这发生在我们的生产代码中,其中class A
是一个智能指针类型,并给出了语义上可疑的结果).
我的问题是:在这种情况下,C++标准中的哪些规则允许两个操作数的隐式转换?我可以理解,如果另一个操作数已经是a 而不是两者,那么一个操作数将被隐式转换bool
为相等的测试.bool
的道格拉斯-普克线简化算法具有O(N²)的最坏情况下的时间复杂度.然而,对于实际触发这种最坏情况的一条线,两件事必须立即"错误":
log(n)
,从而导致总体时间复杂度O(n log(n))
.)虽然第一个标准很容易触发(只是将公差阈值设置为0.0),但我还没有找到满足第二个标准的线.
那么是否存在导致最坏情况行为的简单示例行(最好是触发明显最坏情况的行为,其中每个递归步骤中具有最高偏差的点直接连接到行的一个端点;但是任何其他示例还好吗?