【问题标题】:Boost lambda bewilderment增强 lambda 困惑
【发布时间】:2009-03-19 22:14:09
【问题描述】:

为什么只调用一次回调?

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;
}

【问题讨论】:

    标签: c++ boost-bind boost-lambda


    【解决方案1】:

    || 表达式short circuits 在第一次bind 之后返回true

    第一次评估

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

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

    你说的每一次

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

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

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

    【讨论】:

    • 那是因为 Boost.Lambda 的操作符||专门设计用于与 bind() 返回的仿函数对象的延迟执行能力相结合进行短路。一个普通的重载运算符||不会短路。
    • 是的,这是它的一个不错的功能。通常,如果您重载运算符||,则不会发生短路。 boost lambda 似乎可以解决这个问题。
    【解决方案2】:

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

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

    这还是要靠你知道||操作符短路了,就像Daniel explained一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-30
      • 2019-12-07
      • 1970-01-01
      • 2012-07-12
      • 1970-01-01
      相关资源
      最近更新 更多