&&
和||
等运算符执行短路评估。此外,当使用参数调用函数时,所有参数都在调用函数之前构造。
例如,采取以下三个功能
bool f1();
bool f2();
bool f3(bool, bool);
如果我打电话
if( f3(f2(),f1()) )//Do something
然后在调用f2
之前评估f1
和f3
的返回值。 但,如果我使用(常规)operator||
代替f3
,则上述代码将等同于
if( f2()||f1() )//Do something
如果f1
评估为真,则不会评估和f2
。
我的问题是:是否有可能让f3
(用户定义的函数采用两个布尔值)的行为方式相同?如果不是,是什么让operator||
如此特别?
答案 0 :(得分:2)
如果f3()取得函数结果的值,则不行。
但如果它需要函数的地址(或者更通常将其输入视为函子)而不是结果,那么f3()可以决定是否需要调用函数。
template<typename F1, typename F2>
bool f3(F1 const& f1, F2 const& f2)
{
return f1() || f2();
}
bool f1();
bool f2();
int main()
{
f3(&f1, &f2);
}
答案 1 :(得分:0)
你的前提是不正确的。重载operator||
和operator&&
始终评估两者他们的参数;没有短路。
参见More Effective C++的第7项,以便对此进行讨论。
答案 2 :(得分:0)
你无法比较||操作员和类似的功能。 ||是逻辑运算符,它检查给定的值,如果左操作数被评估为false,则不需要检查正确的值。
对于函数,f1()或f2()返回的任何值对f3()都有效。无法为函数参数启用“逻辑操作数”功能,即使它们采用bool参数也是如此。