【问题标题】:Inserting std::shared_ptr with lambda into a vector将带有 lambda 的 std::shared_ptr 插入向量中
【发布时间】:2014-01-18 19:37:33
【问题描述】:

我有一个向量定义为:

std::vector<std::shared_ptr<Orders> > vOrders;

添加到vOrders 时,我想添加如下:

vOrders.push_back(<std::shared_ptr<Orders> >([]() {
    TimerForProcessingOrders _timerForProcessingOrders;
    _timerForProcessingOrders.detach();
}));

但是编译器给了我一个错误:

Expected expression: Expected '(' for function-style cast or type construction

std::shared_ptr 周围的 &lt;&gt; 看起来很奇怪,但删除它会出现错误:

No matching conversion for functional-style cast from '<lambda >' to 'std::shared_ptr<Orders>'

我犯了什么错误?

【问题讨论】:

  • 您希望使用 lambda 完成什么?
  • 什么是订单?请添加其定义
  • 使用std::make_shared。它还消除了那些额外的尖括号的问题。

标签: c++ c++11 lambda shared-ptr stdvector


【解决方案1】:

这段代码的作用(以一种格式错误的方式)是获取由 lambda 构造的对象,并将 lambda 本身存储到向量中——而不是向量所需要的 shared_ptr&lt;Order&gt; 类型的对象。

但是编译器给了我一个错误:

这是因为多余的&lt; &gt; 是完全无效的语法,所以编译器能给你的最好的就是“无效的表达式”。

std::shared_ptr 周围的 看起来很奇怪,但删除它会报错:
No matching conversion for functional-style cast from '&lt;lambda &gt;' to 'std::shared_ptr&lt;Orders&gt;'

基本上你在这里拥有的是shared_ptr&lt;Orders&gt;(/* .. Lambda .. */)——编译器说它不知道如何将lambda转换为Orders*以进入shared_ptr

您实际上想在这里完成什么?

如果您只想将指针转移到shared_ptr,您可以执行类似的操作

TimerForProcessingOrders _timerForProcessingOrders;
std::shared_ptr<Orders> ptr(_timerForProcessingOrders.detach());
vOrders.emplace_back(std::move(ptr));

不需要 lambda。

【讨论】:

  • 嗯,我读到:baptiste-wicht.com/2012/03/… 并喜欢使用 lambda 创建线程的方面,这适用于我在应用程序的其他区域,这种风格非常方便。
  • @Jason: std::thread 接受一个函数对象。 lambda 一个函数对象,不需要转换。 lambda 不是 Orders ,并且Orders 无法从 lambda 神奇地创建自己。结果,您会收到编译器说“我不知道如何从未命名的 lambda 类型创建Orders*”的错误
  • @Jason:注意第三个接受函数对象的thread 构造函数:en.cppreference.com/w/cpp/thread/thread/thread(其中的 lambda 是有效类型)
  • 谢谢,读起来很有意义。所以我需要从 lambda 返回一个Orders
  • @Jason:不,这里没有任何 lambda 的理由。如果您从 lambda 返回 Orders,那么您需要立即调用 lambda 以获取它将返回的 Orders
【解决方案2】:

Orders 是什么类型?实际上,这并不重要:表达式[](){ ... } 肯定不是可转换为Orders* 的类型。 ... 以及 push_back() 参数周围的尖括号绝对是错误的。

您的意思是调用 lambda 表达式吗?

vOrders.push_back(std::shared_ptr<Orders>([]() {
        TimerForProcessingOrders _timerForProcessingOrders;
        return _timerForProcessingOrders.detach();
    })()
); // ^^ note these extra parenthesis

...但即使这样也不应该工作,因为 lambda 表达式不返回任何内容(因此还添加了 return)。

【讨论】:

    【解决方案3】:

    首先,我建议您遵循 Billy ONeals 的思路。但是,如果您想按照自己的方式去做,这就是它的 SSCE。

    有两个变化,这个lambda返回一个对象并被执行,从而返回。

    #include <vector>
    #include <memory>
    #include <iostream>
    
    struct Foo {
        int val;
    };
    
    int main(int argc, char** argv) {
        std::vector<std::shared_ptr<Foo> > v;
        v.push_back([]() -> std::shared_ptr<Foo> { Foo f; f.val = 5; return std::make_shared<Foo>(f); }());
        std::cout <<v[0]->val <<std::endl;
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 2014-09-08
      • 2020-01-08
      • 2016-03-21
      相关资源
      最近更新 更多