按值捕获成员变量

ron*_*nag 9 c++ lambda c++11

使用C++ 11 lambda表达式时,如何按值捕获成员变量?

使用[my_member]语法似乎不起作用,隐式捕获使用this指针.需要的是一种明确指定成员变量的捕获类型的方法.那可能吗?

我现在的解决方法是:

void member_function()
{
    std::shared_ptr<my_member_class> my_member_copy = my_member; // this shouldn't be necessary
    std::async([=]{ std::cout << *my_member_copy; });
    // std::async([=]{ std::cout << *my_member_; }); // wrong, my member could be potentially out of scope
}
Run Code Online (Sandbox Code Playgroud)

Mot*_*tti 7

我不认为您可以按值捕获成员,您可以捕获this但是因为成员是this您的一部分将使用共享成员而不是新变量.

不知道你的成员是什么类型的东西应该工作:

auto copy = my_member;
std::async([copy]{ std::cout << copy; });
Run Code Online (Sandbox Code Playgroud)

我不明白为什么你shared_ptr在你的例子中使用a ,如果你想通过值捕获肯定shared_ptr是你应该考虑的最后一件事.


rkj*_*nsn 5

不幸的是,我认为没有简单的方法可以做到这一点,但是我可以想到几种无需额外复制即可捕获成员的方法。

第一个选项与您的示例相似,但是对局部变量使用了引用:

void member_function()
{
   std::shared_ptr<my_member_class> &my_member_ref = my_member;
   // Copied by the lambda capture
   std::async([my_member_ref]{ std::cout << *my_member_ref; });
}
Run Code Online (Sandbox Code Playgroud)

请注意,GCC 4.6.2之前的版本中存在一个错误,导致无法复制该值。请参见在C ++ 0x lambda中通过复制捕获参考变量

第二种方法是使用bind制作副本:

void member_function()
{
   // Copied by std::bind
   std::async(std::bind([](const shared_ptr<my_member_class>& my_member){
      std::cout << *my_member; }, my_member));
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,bind将创建自己的副本my_member,然后该副本将通过引用传递给lambda表达式。

  • @ronag我的示例与您的解决方法之间的主要区别在于,我的示例不会额外复制`my_member`。我的第一个示例仅将成员绑定到本地引用,从而允许在lambda捕获中通过值捕获它,而无需先复制。我的第二个示例是一种避免一起使用局部变量的方法,该方法使用bind通过值而不是lambda捕获来捕获“ my_member”。 (3认同)