std :: async使用绑定到lambda的右值引用

我正在尝试使用来将右值引用绑定到lambda std::bind,但是当我将其放入std::async调用中时遇到问题:(source

auto lambda = [] (std::string&& message) {
    std::cout << message << std::endl;
};
auto bound = std::bind(lambda, std::string{"hello world"});
auto future = std::async(bound); // Compiler error here
future.get()

这发出了一个编译器错误,我不确定如何解释:

错误:“类std :: result_of(std :: basic_string)>&()>中没有名为“ type”的类型

这里发生了什么?有趣的是,稍加修改便可以按预期进行编译和运行。如果我更改std::string{"hello world"}为C字符串文字,则一切正常:(source

auto lambda = [] (std::string&& message) {
    std::cout << message << std::endl;
};
auto bound = std::bind(lambda, "hello world");
auto future = std::async(bound);
future.get(); // Prints "hello world" as expected

为什么这样做有效,但第一个示例无效?

普雷托里亚人

std::bind将复制该std::string参数并将其传递给lambda。但这无法编译,因为lambda需要一个rvalue参数,而bind传递给它的将是一个lvalue。如果您bind要讨论move该参数,则可以使它起作用,但这需要非常难看的转换才能消除歧义(因为这std::move是一个重载函数)。

auto bound = std::bind(lambda, std::bind(static_cast<std::string&&(*)(std::string&)>(std::move),
                                         std::string{"hello world"}));

现场演示

当然,您可以编写自己的move未超载版本,并避免进行强制转换。

第二种情况有效,因为bind将传递char const *给lambda时,std::string会隐式创建一个右值临时


为了解释您所看到的错误消息std::asyncstd::result_of正在调用的内幕中的某处以确定函数调用表达式的返回类型。但是,由于上述原因,该调用表达式无效,因此result_of已被SFINAE删除(这是C ++ 14的更改)。因此错误error: no type named 'type' in 'class std::result_of<...>'

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

包装右值引用Lambda时std :: async和std :: bind之间的区别

来自分类Dev

将临时右值绑定到std :: vector构造函数中的引用左值

来自分类Dev

std :: bind():以右值引用作为参数绑定lambda

来自分类Dev

通过右值引用传递并使用std :: move()返回?

来自分类Dev

在右值引用参数上使用std :: move的原因

来自分类Dev

通过右值引用传递并使用std :: move()返回?

来自分类Dev

没有std :: move的右值引用

来自分类Dev

将std :: make_pair与std :: string一起使用(非右值引用问题)

来自分类Dev

为什么在右值引用上使用std :: forward会导致被引用对象的破坏?

来自分类Dev

BST与std :: unique_ptr:在参数中使用右值引用有什么区别?

来自分类Dev

可以使用右值初始化 const std::array 成员引用吗?

来自分类Dev

std :: bind绑定到std :: array的operator []

来自分类Dev

右值引用参数在通过std :: forward传递时到期。

来自分类Dev

std :: thread构造函数如何检测右值引用?

来自分类Dev

右值引用上的std :: vector <T> :: emplace_back

来自分类Dev

左值到右值引用绑定

来自分类Dev

左值到右值引用绑定

来自分类Dev

const引用如何绑定到右值

来自分类Dev

std :: async vs std :: promise

来自分类Dev

何时使用std :: async与std :: threads?

来自分类Dev

修改通过std :: future的lambda中的引用捕获的值

来自分类Dev

std :: bind作为值绑定到局部变量

来自分类Dev

当我们使用右值引用时,究竟发生了什么?std :: move如何工作?

来自分类Dev

当我们使用右值引用时,究竟发生了什么?std :: move如何工作?

来自分类Dev

错误:无法将std :: ostream左值绑定到std :: basic_ostream <char> &&

来自分类Dev

将const引用绑定到右值引用

来自分类Dev

std :: bind绑定到std :: function会导致Clang崩溃

来自分类Dev

为什么要通过右值引用还是按值来获取std :: initializer_list?

来自分类Dev

为什么要通过右值引用还是按值来获取std :: initializer_list?

Related 相关文章

  1. 1

    包装右值引用Lambda时std :: async和std :: bind之间的区别

  2. 2

    将临时右值绑定到std :: vector构造函数中的引用左值

  3. 3

    std :: bind():以右值引用作为参数绑定lambda

  4. 4

    通过右值引用传递并使用std :: move()返回?

  5. 5

    在右值引用参数上使用std :: move的原因

  6. 6

    通过右值引用传递并使用std :: move()返回?

  7. 7

    没有std :: move的右值引用

  8. 8

    将std :: make_pair与std :: string一起使用(非右值引用问题)

  9. 9

    为什么在右值引用上使用std :: forward会导致被引用对象的破坏?

  10. 10

    BST与std :: unique_ptr:在参数中使用右值引用有什么区别?

  11. 11

    可以使用右值初始化 const std::array 成员引用吗?

  12. 12

    std :: bind绑定到std :: array的operator []

  13. 13

    右值引用参数在通过std :: forward传递时到期。

  14. 14

    std :: thread构造函数如何检测右值引用?

  15. 15

    右值引用上的std :: vector <T> :: emplace_back

  16. 16

    左值到右值引用绑定

  17. 17

    左值到右值引用绑定

  18. 18

    const引用如何绑定到右值

  19. 19

    std :: async vs std :: promise

  20. 20

    何时使用std :: async与std :: threads?

  21. 21

    修改通过std :: future的lambda中的引用捕获的值

  22. 22

    std :: bind作为值绑定到局部变量

  23. 23

    当我们使用右值引用时,究竟发生了什么?std :: move如何工作?

  24. 24

    当我们使用右值引用时,究竟发生了什么?std :: move如何工作?

  25. 25

    错误:无法将std :: ostream左值绑定到std :: basic_ostream <char> &&

  26. 26

    将const引用绑定到右值引用

  27. 27

    std :: bind绑定到std :: function会导致Clang崩溃

  28. 28

    为什么要通过右值引用还是按值来获取std :: initializer_list?

  29. 29

    为什么要通过右值引用还是按值来获取std :: initializer_list?

热门标签

归档