gpt4 book ai didi

c++ - VS2015 C++协程: promise. get_return_object()返回类型和协程返回类型

转载 作者:行者123 更新时间:2023-11-30 03:37:36 26 4
gpt4 key购买 nike

我对协程 TS 的 Visual Studio 2015 实现有疑问。 P0057r5工作文件指出协程的行为就好像它的主体是:

{
P p;
auto gro = p.get_return_object();
co_await p.initial_suspend(); // initial suspend point
F’
final_suspend:
co_await p.final_suspend(); // final suspend point
}

(§ 8.4.4\3)并且当协程返回其调用者时,返回值就像语句 return gro; (§ 8.4.4\5)

一样产生

请注意,p.get_return_object() 的结果存储在推导类型为 auto 的变量中。

设协程返回类型为Apromise.get_return_object()返回类型为B。根据上面提到的 P0057r5 变量 gro 应该有类型 B(由 auto 推导)和类型 A 的对象应该当协程返回到它的调用者时,从 gro 构造(例如,在 B 中使用转换运算符或在 A 中使用 B 的隐式构造函数)。

在当前的 Visual Studio 实现中(编译器版本字符串:“Microsoft (R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x86”)转换是在 p.initial_suspend() 之后和 F' 被调用,就好像 gro 类型被设置为匹配协程的返回类型 (A) 而不是 promise 的返回类型.get_return_object() (B).

我是不是遗漏了什么或者这是一个错误?

最小示例(使用/await 编译):

#include <experimental/coroutine>
#include <iostream>

struct foo;
struct foo_builder {
foo_builder() {
std::cout << "foo_builder constructor\n";
}
operator foo();
};

struct foo_promise {
foo_builder get_return_object() {
return{};
}
void return_value(int value) {
std::cout << "co_return with " << value << "\n";
}
std::experimental::suspend_never initial_suspend() {
std::cout << "Initial suspend\n";
return{};
}
std::experimental::suspend_never final_suspend() {
return{};
}
};

struct foo {
foo() {
std::cout << "foo constructor\n";
}
using promise_type = foo_promise;
};

foo_builder::operator foo() {
std::cout << "foo_builder conversion to foo\n";
return{};
}

foo coroutine() {
co_return 5;
}

foo simple() {
foo_promise p;
auto gro = p.get_return_object();
// co_await p.initial_suspend(); // initial suspend point

// co_return 5;
p.return_value(5); //S;
goto final_suspend;

final_suspend:
// co_await p.final_suspend(); // final suspend point
return gro;
}


int main() {
auto v = coroutine();

std::cout << "\nregular function:\n";

auto v2 = simple();

std::cin.ignore();
}

输出:

Initial suspend
foo_builder constructor
foo_builder conversion to foo
foo constructor
co_return with 5

regular function:
foo_builder constructor
co_return with 5
foo_builder conversion to foo
foo constructor

最佳答案

在 p0057r5 中添加了通过 auto gro 捕获 get_return_object() 的返回值。在之前的修订版 (p0057r4) 中,这部分读作

...the coroutine behaves as if its body were:

{
P p ;
co_await p .initial_suspend(); // initial suspend point
F’
final_suspend :
co_await p .final_suspend(); // final suspend point
}

When a coroutine returns to its caller, the return value is obtained by a call to p.get_return_- object(). A call to a get_return_object is sequenced before the call to initial_suspend and is invoked at most once.

VS2015 显然实现了本文的旧版本。

关于c++ - VS2015 C++协程: promise. get_return_object()返回类型和协程返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40118095/

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