背景
我有个任务类型既可以co_return和co_yield。在 LLVM 中,任务按预期工作并通过了一些早期测试。在 MSVC 和 GCC 中,代码以相同的方式失败(巧合?)。
简要问题
具有以下测试功能:
Task<int> test_yielding()
{
co_yield 1;
co_return 2;
}
Run Code Online (Sandbox Code Playgroud)
从 Task 对象中检索了两个值。
auto a = co_await fn;
auto b = co_await fn;
Run Code Online (Sandbox Code Playgroud)
a 的值预期为 1,b 的值预期为 2。
结果针对 进行测试a + b == 3。
上面的测试通过了,但是下面的测试失败了:
auto res = co_await fn + co_await fn
Run Code Online (Sandbox Code Playgroud)
GCC 和 MSVC 的 res 值为 4。两者都是从最终的 co_return 中检索到的。据我了解,第一次和第二次调用的co_await fn顺序应该是 1 和 2。
在 MSVC 和 GCC 中,代码失败,因为它们似乎重新排序await_resume,return_value …