为什么嵌套绑定可以推迟对表达式的求值

时间:2017-02-13 15:21:10

标签: c++ c++11

[Effective modern C ++]中的第34项给出了一个示例,嵌套绑定可以推迟steady_clock::now()的评估,直到调用setAlarm为止。 std::chrono::steady_clock::now实际上是static成员函数。我的理解是,只要它作为函数参数传递,它就会被评估。

任何人都可以帮忙详细说明为何可以延期吗?

auto setSoundB =
    std::bind(setAlarm,
        std::bind(std::plus<>(), steady_clock::now(), 1h),
        _1,
        30s);

1 个答案:

答案 0 :(得分:6)

在您的示例中,不会延迟对steady_clock::now()的调用。

要阻止steady_clock::now()现在进行评估,请将其包含在另一个bind来电中:

std::bind(&steady_clock::now)

E.g:

auto mynow() {
    std::cout << "mynow\n";
    return std::chrono::steady_clock::now();
}

int main(int ac, char**) {
    std::cout << "creating a bind object\n";
    auto f = std::bind(std::plus<>(), mynow(), 1h);
    std::cout << "invoking bind object\n";
    f();


    std::cout << "\ncreating a bind object\n";
    auto g = std::bind(std::plus<>(), std::bind(&mynow), 1h);
    std::cout << "invoking bind object\n";
    g();
}

输出:

creating a bind object
mynow
invoking bind object

creating a bind object
invoking bind object
mynow

有关详细信息,请参阅std::bind

  

成员函数运算符()

     

如果存储的参数arg的类型为T std::is_bind_expression<T>::value == true(例如,另一个bind表达式直接传递给{{1}的初始调用然后bind执行函数组合:不是传递bind子表达式将返回的函数对象,而是急切地调用子表达式,并将其返回值传递给外部可调用对象...