簡體   English   中英

VS2017協程為什么不能返回void?

[英]Why can't VS2017 coroutines return void?

我正在使用建議的c ++協例程進行一些實驗,這些協例目前在VS2017中處於實驗階段。 我只是想擁有一個不返回任何內容的協同例程,而是在某個協同例程對象上調用co_await,也就是說,該對象在恢復之前在另一個線程上進行了一些處理。 但是,VS甚至不會編譯返回void的最基本的協同程序。 例如:

#include "stdafx.h"
#include <experimental\coroutine>

using namespace std::experimental;

void bob()
{
    co_await suspend_always{};
}

int main()
{
    bob();
}

導致錯誤:

1> c:\\ program files(x86)\\ Microsoft Visual Studio \\ 2017 \\ professional \\ vc \\ tools \\ msvc \\ 14.10.25017 \\ include \\ experimental \\ resumable(46):錯誤C2825:'_Ret':必須是類或命名空間后跟'::'1> d:\\ dev \\ coroutinestest \\ main.cpp(10):注意:請參見對正在編譯的類模板實例化'std :: experimental :: coroutine_traits的引用1> c:\\ program文件(x86)\\ Microsoft Visual Studio \\ 2017 \\ Professional \\ vc \\ tools \\ msvc \\ 14.10.25017 \\ include \\ experimental \\ resumable(46):錯誤C2510:'_Ret':'::'的左邊必須是類/結構/聯盟1> c:\\ program files(x86)\\ microsoft visual studio \\ 2017 \\ professional \\ vc \\ tools \\ msvc \\ 14.10.25017 \\ include \\ experimental \\ resumable(46):錯誤C2061:語法錯誤:標識符'promise_type' 1> c:\\ program files(x86)\\ microsoft visual studio \\ 2017 \\ professional \\ vc \\ tools \\ msvc \\ 14.10.25017 \\ include \\ experimental \\ resumable(46):錯誤C2238:';'之前的意外標記

現在,我假定此錯誤是由於void :: promise_type毫無意義,但是為什么在沒有任何返回值的情況下甚至會實例化promise類型? 我希望能夠從協同例程中不返回任何內容。 這僅僅是實現中的當前錯誤,還是我誤解了使用協同例程。

謝謝

當然它可以返回void 它之所以沒有這樣做的原因-沒有人為void實現協程協議。 您可以自己實施。 通過為coroutine_traits提供專門化,可以滿足返回類型的協程協議。

要使void成為協程的有效返回類型,可以執行以下操作:

namespace std::experimental
{
    template<class... T>
    struct coroutine_traits<void, T...>
    {
        struct promise_type
        {
            void get_return_object() {}

            void set_exception(exception_ptr const&) noexcept {}

            bool initial_suspend() noexcept
            {
                return false;
            }

            bool final_suspend() noexcept
            {
                return false;
            }

            void return_void() noexcept {}
        };
    };
}

這樣可以編譯您的示例。

但是,請注意,在您的示例中,調用co_await suspend_always{}; 會導致內存泄漏,這是因為coroutine_handle很像原始指針,並且您必須自己確保協程被銷毀。

附帶說明一下,協程仿真庫CO2會做出另一個決定-它的co2::coroutine具有唯一所有權,因此調用CO2_AWAIT(suspend_always{}); 不會泄漏內存,只會取消協程。

當嘗試調試編譯器錯誤消息時,我偶然發現了這個問題。 對我來說,解決方案是使函數返回IAsyncAction而不是返回void

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM