代码示例:
struct Foo
{
/* ... */
};
struct GenericPromise
{
std::suspend_always initial_suspend() noexcept { return {}; }
std::suspend_always final_suspend() noexcept { return {}; }
void return_void() {}
void unhandled_exception() {}
virtual ~GenericPromise() = default;
};
struct Coroutine
{
std::coroutine_handle<GenericPromise> handle;
struct promise_type : Foo, GenericPromise
{
Coroutine get_return_object()
{
return { std::coroutine_handle<GenericPromise>::from_promise(*this) };
}
int AdditionalData = 42;
};
};
Coroutine Coro()
{
co_return;
}
int main(int argc, char* argv[])
{
Coroutine coro = Coro();
coro.handle.resume();
assert(coro.handle.done());
coro.handle.destroy();
}
该程序保证可以按预期工作,或者是通过不同类型的coroutine_handle访问潜在的错误/ub?
您可以保持给定的coroutine-要么用
std::coroutine_handle<>
(是
std::coroutine_handle<void>
)或通过
std:::coroutine_handle<PromiseType>
PromiseType
是您的coroutines的确切类型。
请参阅什么coroutine_handle ::from_address
cppreference说:如果ADDR既不是零指针值也不是Coroutine_handle的基础地址,则行为是不确定的。
如果addr是std :: coroutine_handle的基础地址,则行为也是不确定的。想象一下,Coroutine_handle只是
void*
承诺对象的一些包装器。在没有Coroutine世界中
任何人 - 在您的情况下 - 我会考虑存储
P*
并指向您的“通用”基类:
void*