【问题标题】:C++ Cannot convert lambda to std::packaged_task in std::pairC++ 无法将 lambda 转换为 std::pair 中的 std::packaged_task
【发布时间】:2015-07-09 10:28:53
【问题描述】:

我用std::packaged_task 做了一些测试,遇到了这个问题。

std::packaged_task<int(void)> task([]() -> int { return 1; });
task();

编译并调用 task() 调用 lambda。但是,这不会编译:

std::pair<int, std::packaged_task<int(void)>> pair(15, []() -> int { return 15; });
pair.second();

因为

错误 C2664:“std::pair&lt;int,std::packaged_task&lt;int (void)&gt;&gt;::pair(const std::pair&lt;int,std::packaged_task&lt;int (void)&gt;&gt; &amp;)”:无法将参数 2 从“main::&lt;lambda_abbe6cccb9110894d95e872872ec1296&gt;”转换为“const std::packaged_task&lt;int (void)&gt; &amp;

但是,这确实可以编译:

std::vector<std::packaged_task<int()>> v;
v.emplace_back([](){ return 1; })

为什么我不能创建pair

【问题讨论】:

    标签: c++ c++11 lambda stl


    【解决方案1】:

    有问题的构造函数是显式构造函数。您需要显式调用它才能编译:

    std::pair<int, std::packaged_task<int(void)>> 
        pair(15, std::packaged_task<int(void)>{ []() -> int { return 15; } });
    

    或者,更好的是,使用std::make_pair

    auto pair = 
        std::make_pair(15, std::packaged_task<int(void)>{ []() -> int { return 15; } });
    

    vector 的情况有效,因为emplace_back 将参数转发给value_type 的构造函数。如果您尝试使用push_back,它将无法正常工作。

    【讨论】:

      猜你喜欢
      • 2022-01-27
      • 1970-01-01
      • 1970-01-01
      • 2020-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多