我正在尝试实现自己的布尔类,但无法为 && 复制本机语义。以下人为代码演示了该问题:
#include <iostream>>
class MyBool {
public:
bool theValue;
MyBool() {}
MyBool(bool aBool) {theValue = aBool;}
MyBool operator&& (MyBool aBool) {return theValue && aBool.theValue;}
};
bool f1() {std::cout << " First\n"; return false;}
bool f2() {std::cout << " Second\n"; return false;}
int main(int argc, char** argv) {
std::cout << "Native &&\n";
f1() && f2();
std::cout << "Overloaded &&\n";
MyBool(f1()) && MyBool(f2());
return 0;
}
编译运行后,结果为:
本国的 && 第一的 重载 && 第二 第一的
换句话说,bools 上的 && 是惰性的(正如任何 C++ 程序员所期望的那样),但重载的 && 不是(正如这位 C++ 程序员至少没有预料到的那样)。
有没有办法让重载的 && 变得懒惰?我可以找到各种完整的惰性评估方案来提供类似 Haskell 的功能,但对于我的用例来说,它们似乎完全是矫枉过正。