使用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)
我不认为您可以按值捕获成员,您可以捕获this但是因为成员是this您的一部分将使用共享成员而不是新变量.
不知道你的成员是什么类型的东西应该工作:
auto copy = my_member;
std::async([copy]{ std::cout << copy; });
Run Code Online (Sandbox Code Playgroud)
我不明白为什么你shared_ptr在你的例子中使用a ,如果你想通过值捕获肯定shared_ptr是你应该考虑的最后一件事.
不幸的是,我认为没有简单的方法可以做到这一点,但是我可以想到几种无需额外复制即可捕获成员的方法。
第一个选项与您的示例相似,但是对局部变量使用了引用:
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表达式。