К сожалению, я не думаю, что есть прямой способ сделать это, но я могу придумать пару способов захватить участника без создания дополнительной копии.
Первый вариант похож на ваш пример, но использует ссылку на локальную переменную:
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; });
}
Обратите внимание, что в версиях GCC, предшествующих 4.6.2, имеется ошибка, из-за которой значение не копируется. См. Захват ссылочной переменной путем копирования в C ++ 0x лямбда .
Второй подход - использовать связывание для создания копии:
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));
}
В этом примере bind создаст свою собственную копию my_member
, и эта копия затем будет передана лямбда-выражению по ссылке.