用户在C++中重载逻辑运算符(&&, ||
)的行为与常规函数类似。也就是说,在进入函数之前,对bool operator&&(const T &a, const T2 &b);
中的两个参数进行求值,因为输入函数是C++中的序列点[1]。一切都很好,在这里。对C++逻辑&&和||进行短路评估运算符
现在,“内建运营商& &和||执行短路评估“[2] [3],其中左侧和右侧之间存在序列点。引用的参考文献不清楚“内建”是什么,只是它们采用bool
操作数,或者使用“上下文转换为bool”转换它们。它还提到,只有“两个标准库类重载这些运算符[因为]短路属性(...)不适用于重载,并且因为具有布尔语义的类型并不常见。”[2]
类型与布尔语义? “内建运营商”究竟如何运作?用短路评估来定义逻辑运算符是不可能的?
[1] https://en.wikipedia.org/wiki/Sequence_point
[2] http://en.cppreference.com/w/cpp/language/operator_logical
[3] https://en.wikipedia.org/wiki/Short-circuit_evaluation
“定义符合短路评估的逻辑运算符是不可能的?”是的,这是“根本不可能的”。您的运算符函数需要两个参数,完全评估,这意味着编译器不能做任何短路。如果你想对你的自定义类型进行短路评估,那么你需要将转换运算符实现为'bool'而不是逻辑运算符。 –
我的阅读是“内建”是指“这是一种内置的语言功能”,而不是“这是标准库的一部分”。你不能创建你自己的内建操作符,除非你用自己的非标准扩展名创建自己的编译器。 –
[实际上是否有重载&&和||的原因不要短路?(http://stackoverflow.com/questions/25913237/is-there-actually-a-reason-why-overloaded-and-dont-short-circuit) – quamrana