[英]VS2015 C++ coroutines: promise.get_return_object() return type and coroutine return type
我有一个关于Coroutines 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
推断类型的变量中。
假设协程返回类型为A
, promise.get_return_object()
返回类型为B
根据P0057r5上述可变提到gro
应具有类型B
(由推断auto
)和类型的对象A
应从被构造gro
当协程返回到它的调用者(例如,在使用转换运算符B
从或隐式构造B
在A
)。
在当前的Visual Studio实现中(编译器版本字符串:“用于x86的Microsoft(R)C / C ++优化编译器版本19.00.24215.1”),在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)中,该部分的内容为
...协程的行为就像它的身体是:
{
P p ;
co_await p .initial_suspend(); // initial suspend point
F’
final_suspend :
co_await p .final_suspend(); // final suspend point
}
和
当协程返回其调用方时,通过调用p.get_return_- object()获得返回值。 对get_return_object的调用在对initial_suspend的调用之前被排序,并且最多被调用一次。
VS2015显然实现了本文的旧版本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.