用户在C++中超载逻辑运算符(&&, ||
)的行为类似于常规函数。也就是说,在进入函数之前,bool operator&&(const T &a, const T2 &b);
中的两个参数都会被评估,因为在C++中进入函数是一个序列点[1]。到此为止一切都很好。
现在,“内置运算符&&和||进行短路计算”[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短路求值