3

为什么回调只调用一次?

bool callback()
{
    static bool res = false;
    res = !res;
    return res;
}

int main(int argc, char* argv[])
{
    vector<int> x(10);

    bool result=false;
    for_each(x.begin(),x.end(),var(result)=var(result)||bind(callback));

    return 0;
}
4

2 回答 2

8

第一次后短路||表达式返回。bindtrue

第一次评价

result = result || bind(...)  // result is false at this point

bind被调用,因为这是确定 的值的唯一方法false || bind(...)。因为bind(...)返回trueresult被设置为true

每次你说

result = result || bind(...)  // result is true at this point

...不计算bind(...)表达式,因为它返回什么并不重要;表达式true || anything总是true,||表达式短路.

确保bind始终调用的一种方法是将其移动到 的左侧||,或将 更改||&&,具体取决于您要完成的任务result

于 2009-03-19T22:20:15.100 回答
1

在您的特定示例中,Boost.Lambda 并没有真正为您带来任何好处。去掉 lambda 部分,也许你会更清楚地看到发生了什么:

for (int i = 0; i < 10; ++i)
  result = result || callback();

正如丹尼尔解释的那样,这仍然取决于您知道||操作员是否短路。

于 2009-03-19T22:41:44.223 回答