我在http://en.cppreference.com/w/cpp/language/operators中读到:
引用: 布尔逻辑运算符,运算符&&和运算符|| 与内置版本不同,重载版本不会在右操作数之前对左操作数进行排序,并且(直到C++17)无法实现短路评估。
(我强调)。
找不到任何支持运算符&&和运算符||的C++17短路的资源或代码示例。 这与C++17参数包折叠表达式有关吗?尝试过一些操作,但无法使用C++17折叠表达式为重载的运算符&&和||创建短路行为。
代码:
引用: 布尔逻辑运算符,运算符&&和运算符|| 与内置版本不同,重载版本不会在右操作数之前对左操作数进行排序,并且(直到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
注意:在当前使用C++17标志编译的gcc版本中,从左到右的顺序也没有发生。
(until c++17)
标记适用于“不要将左操作数的顺序排在右操作数之前”,在C++17中,对重载运算符函数的调用遵循与相应内置运算符相同的顺序。据我所知,仍然无法创建短路行为。 - cpplearneroperator&&()
只能接受一个参数,所以将其写成可变模板有点具有误导性。 - Barry