懒惰,重载C++ &&运算符?

use*_*449 8 c++ boolean lazy-evaluation operator-keyword

我正在尝试实现自己的布尔类,但不能复制&&的本机语义.以下设计的代码演示了这个问题:



    #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;
}

Run Code Online (Sandbox Code Playgroud)

编译和运行时,结果是:


    Native &&
       First
    Overloaded &&
       Second
       First

换句话说,&& on bools是懒惰的(正如任何C++程序员所期望的那样)但是重载的&&不是(正如这个C++程序员至少没想到的那样).

有没有办法让重载&&懒惰?我可以找到各种全面的延迟评估方案来提供类似Haskell的功能,但它们看起来像我的用例完全矫枉过正.

jua*_*nza 15

你不应该超载 bool operator&&,因为你已经发现了短路评估.

正确的方法是为您的班级提供一个bool转换运算符

class MyBool {
 public:
  bool theValue;
  MyBool() {}
  MyBool(bool aBool) : theValue(aBool) {}
  explicit operator bool() { return theValue; }
};
Run Code Online (Sandbox Code Playgroud)

请注意,显式转换运算符需要符合C++ 11标准.如果你没有这个,请看看安全的bool成语.

  • +1这是正确的(实际执行的唯一方法) (2认同)

Ton*_*roy 5

有没有办法让超载&&懒惰?

没有。