Я прочитал этот вопрос и ответ.
Объяснение времени жизни лямбды для сопрограмм C++20
Если я правильно понимаю, лямбда-выражение с захватом чего-то небезопасно, если лямбда выражение используется как функция сопрограммы.
Теперь у меня возник следующий вопрос.
Код: Выделить всё
#include
#include
#include
namespace asio = boost::asio;
struct foo {
template
auto mf1(
CompletionToken&& token
) {
return asio::async_initiate<
CompletionToken,
void()
>(
asio::experimental::co_composed<
void()
>(
[]( // capture nothing
auto /*state*/,
foo& self
) -> void {
// co_await some_async_function(asio::deferred);
self.val_++; // accesses member variables via self
co_return {};
}
),
token,
std::ref(*this)
);
}
template
auto mf2(
CompletionToken&& token
) {
return asio::async_initiate<
CompletionToken,
void()
>(
asio::experimental::co_composed<
void()
>(
[this]( // capture this.
auto /*state*/
) -> void {
// co_await some_async_function(asio::deferred);
val_++; // accesses member variables
co_return {};
}
),
token
);
}
int val_ = 0;
};
asio::awaitable proc() {
foo f;
co_await f.mf1(asio::deferred);
co_await f.mf2(asio::deferred);
std::cout
Источник: [url]https://stackoverflow.com/questions/78127298/can-asio-co-composed-lambda-function-capture-this-pointer[/url]