繁体   English   中英

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

[英]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推断类型的变量中。

假设协程返回类型为Apromise.get_return_object()返回类型为B 根据P0057r5上述可变提到gro应具有类型B (由推断auto )和类型的对象A应从被构造gro当协程返回到它的调用者(例如,在使用转换运算符B从或隐式构造BA )。

在当前的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM