【问题标题】:initialization order of lambda as parameter which accepts other parameterslambda 的初始化顺序作为接受其他参数的参数
【发布时间】:2019-02-17 22:05:24
【问题描述】:

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

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

【问题讨论】:

  • 因为你没有描述你想要达到的目标;请记住,AsyncMethod 的 vec 和 lambda 的 vec 是两个不同的向量,因此更改一个中的值不会影响另一个...

标签: c++ lambda move move-semantics


【解决方案1】:

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

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

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

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

【讨论】:

  • 是的,这就是我目前所做的。不过也不是什么大问题。只是想有更自然的阅读流程。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-19
  • 1970-01-01
  • 2014-12-04
相关资源
最近更新 更多