重载运算符&&和||的短路 在C++中17

Ami*_*rsh 13 c++ operator-overloading c++17

我在http://en.cppreference.com/w/cpp/language/operators上读到:

布尔逻辑运算符,运算符&&和运算符||

与内置版本不同,重载不会在右操作数之前对其左操作数进行排序,并且(直到C++ 17)无法实现短路评估.

(我强调).

找不到C++ 17的任何资源或代码示例,支持运算符&&和operator ||的短路.它与C++ 17参数包折叠表达式有关吗?尝试使用它,但无法为重载的运算符&&和||创建短路行为 用C++ 17倍表达式.

码:

class A {
    bool val;
public:
    A(bool b) : val(b) { cout << "A born as " << boolalpha << val << endl;}
    template<typename ...Args>
    bool operator&&(Args&&... args) {
        return (val && ... && args.val);
    }    
};

int main() {
    cout << boolalpha;
    cout << ( A{false} && A{true} ) << endl;
    cout << ( A{true} && A{false} ) << endl;
    cout << ( A{false} && A{false} ) << endl;
}
Run Code Online (Sandbox Code Playgroud)

输出:

A born as true
A born as false
false
A born as false
A born as true
false
A born as false
A born as false
false
Run Code Online (Sandbox Code Playgroud)

http://coliru.stacked-crooked.com/a/f0b5325899c2fe6b

注意:从C到17标志编译的当前gcc版本中也没有发生从左到右的顺序.

Nic*_*las 11

该声明不是关于短路评估.这是关于评估操作数的顺序.

Pre-C++ 17,用于评估重载的&&和||的操作数的顺序 是编译器定义的.C++ 17为&&和||定义了从左到右的显式评估顺序,无论它们是否过载.

短路评估仍然只适用于内置运营商.

请注意,在您引用的实际页面上,突出显示的部分是应用于特定版本的部分.那部分是关于排序顺序,而不是关于短路评估的部分.

  • @ user2357112:就个人而言,只要您知道所有特定于版本的标签仅适用于包含它们的框中的文本,它就好了. (4认同)
  • 这是"直到c ++ 17"标签的不幸放置.我编辑了页面以使语法更清晰. (3认同)