![](/img/trans.png)
[英]Why can't this enable_if function template be specialized in VS2017?
[英]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.