lambda的初始化顺序作为接受其他参数的参数

时间:2018-09-13 08:01:16

标签: c++ lambda move move-semantics

我有一个参数(在本例中为std :: vector),需要将其传递给异步方法(最好通过move)和回调lambda。 下面的方法是否保证lambda将首先被初始化(这意味着要复制矢量),以便我可以将矢量移到异步方法?

Method(std::vector<std::string> vec)
{
    AsyncMethod(std::move(vec), [vec]() 
    {
        // act on vec
    });
}

1 个答案:

答案 0 :(得分:3)

函数参数的求值顺序未指定,因此您不能依赖您的假设。解决方法如下。

Method(std::vector<std::string> vec)
{
    auto l = [vec]() { /* Act on vec... */ };

    AsyncMethod(std::move(vec), l);
}

根据AsyncMethod的签名,您甚至可能希望将lambda传递为std::move(l)。再次安全,因为矢量已预先复制到闭包中。