gpt4 book ai didi

c++ - 使用 GCC 10 泄漏的简单协程

转载 作者:行者123 更新时间:2023-12-01 12:08:14 24 4
gpt4 key购买 nike

考虑以下简单的协程,它跟踪其构建和销毁:

#include <coroutine>
#include <iostream>

struct simple {
static inline int x = 0;
int id = 0;
simple() : id{ x++ } { std::cout << id << " constructed\n"; }
simple(simple&&) : id{ x++ } { std::cout << id << " move constructed\n"; }
~simple() { std::cout << id << " destructed\n"; }

struct promise_type {
simple get_return_object() { return {}; }
void return_void() {}
void unhandled_exception() { std::terminate(); }
auto initial_suspend() noexcept { return std::suspend_never{}; }
auto final_suspend() noexcept { return std::suspend_never{}; }
};
};

simple f() { co_return; }

int main() {
f();
}

使用 GCC 10.1 编译时,输出为:
0 constructed
1 move constructed
1 destructed

——值得注意的是,id 0永远不会被破坏。即使使用 GCC 主干也是如此。

我在这里做错了什么,一些隐藏的UB或类似的东西?还是海湾合作委员会有错?

作为对比,我尝试使用 Clang 的实验性协程支持,并得到
0 constructed
0 destructed

这更接近我的预期。如果我注释掉协程对象中的移动构造函数,即使在 GCC 中,我也会得到这个“正确”的输出。

现场示例: https://godbolt.org/z/UQVURi

最佳答案

正如奥利夫所提到的,这似乎只是 GCC 实验性协程支持的一个错误。已提出票 here .

关于c++ - 使用 GCC 10 泄漏的简单协程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62125871/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com