超负荷操作员的短路和&和||在C ++中17

时间:2016-12-19 16:49:24

标签: c++ operator-overloading c++17

我读了http://en.cppreference.com/w/cpp/language/operators

  

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

     

不同于   内置版本,重载不会对其左操作数进行排序   在正确的之前,(直到C ++ 17)无法实现短路   评价。

(我的重点)。

无法找到支持短路的C ++ 17的任何资源或代码示例 对于运营商和&&和运算符||。 它与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;
}

输出:

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

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

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

1 个答案:

答案 0 :(得分:11)

该陈述不是关于短路评估。它是关于评估操作数的顺序。

Pre-C ++ 17,评估重载&amp;&amp;的操作数的顺序和||是编译器定义的。 C ++ 17定义了一个明确的从左到右的评估顺序&amp;&amp;和||,无论它们是否过载。

短路评估仍然只适用于内置操作员。

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