【发布时间】:2016-06-25 10:19:16
【问题描述】:
C++ 中的用户重载逻辑运算符 (&&, ||) 的行为类似于常规函数。也就是说,bool operator&&(const T &a, const T2 &b); 中的两个参数都在进入函数之前进行评估,因为进入函数是 C++ 中的序列点 [1]。到这里为止一切顺利。
现在,“内置运算符 && 和 ||进行短路评估”[2][3],其中左右两侧之间有一个序列点。引用的参考文献不清楚“内置”是什么,只是它们采用bool 操作数,或使用“上下文转换为布尔值”将它们转换。它还提到只有“两个标准库类重载了这些运算符 [因为] 短路属性 (...) 不适用于重载,而且具有布尔语义的类型并不常见。” [2]
具有布尔语义的类型? “内置运算符”究竟是如何工作的?用短路评估来定义逻辑运算符是不可能的吗?
[1]https://en.wikipedia.org/wiki/Sequence_point
[2]http://en.cppreference.com/w/cpp/language/operator_logical
【问题讨论】:
-
"用短路求值来定义逻辑运算符是不可能的吗?"是的,这“根本不可能”。您的运算符函数需要两个参数,完全评估,这意味着编译器根本不能做任何短路。如果您想要对您的自定义类型进行短路评估,则需要将转换运算符实现为
bool而不是逻辑运算符。 -
我的阅读是“内置”是指“这是一种内置的语言功能”,而不是“这是标准库的一部分”。你不能制作自己的内置运算符,除非你用自己的非标准扩展制作自己的编译器。
-
@JoachimPileborg 我认为短路可以在用户定义的逻辑操作中实现,虽然这不会是微不足道的
标签: c++ c++11 operators short-circuiting