![](/img/trans.png)
[英]“a coroutine's promise must declare either 'return_value' or 'return_void'” Error Visual Studio 2019 C++ 20
[英]C++ coroutine's return_void's and return_value's return type
return_void
考慮下面協程的ReturnObject
並注意方法ReturnObject::promise_type::return_void
之前的注釋:
struct ReturnObject {
struct promise_type {
int val_{23};
ReturnObject get_return_object() {
return {std::coroutine_handle<promise_type>::from_promise(*this)};
}
std::suspend_never initial_suspend() { return {}; }
std::suspend_never final_suspend() noexcept { return {}; }
void unhandled_exception() {}
/*** NOTE THIS ***/
//void return_void(){ }
/*** AND THIS ***/
int return_void(){ return 101; }
};
std::coroutine_handle<promise_type> h_;
ReturnObject(std::coroutine_handle<promise_type> h):h_{h}{ }
operator std::coroutine_handle<promise_type>() const { return h_; }
};
編譯器資源管理器上的完整代碼
web 和本文(第 37 頁)中的標准用法表明return_void
方法返回void
但在 gcc 11.2 中,返回類型為int
的return_void
也適用。 這個對嗎? 如果是,
return_void
的返回值會發生什么?return_value
在 gcc 中可以觀察到與方法return_value
類似的效果。 如果return_value
的返回數據,有沒有辦法直接訪問這個返回的數據,類似於正常的子程序/函數的返回值?
檢查編譯器資源管理器上的代碼
在@useless 的建議之后,我將[[nodiscard]]
添加到return_void
和return_value
中,並使用非 void 返回類型並啟用-Wall
標志。
令人驚訝的是,對於return_void
和return_value
,我什至沒有收到 gcc-10.2 的警告。 檢查這里,但 gcc-11.2 給了我一個警告(這里)
我得到的帶有int
返回類型的return_value
的編譯器警告如下所示
warning: ignoring return value of 'int ReturnObject::promise_type::return_value(int)', declared with attribute 'nodiscard' [-Wunused-result]
31 | co_return 7;
| ^
<source>:18:27: note: declared here
18 | [[nodiscard]] int return_value(int val){return val;}
我不相信編譯器警告co_return
的值正在被丟棄。 實際上,被丟棄的返回值來自方法return_value
但編譯器設法以某種方式掩蓋它。
感謝您查看帖子並提前提出建議。
[stmt.return.coroutine]/2表示表達式
promise_object.return_value(...)
和
promise_object.return_void()
(以co_return
使用的為准)應為void
類型。
因此 function 的返回類型必須為void
(如果它被co_return
使用)。
MSVC 確實正確拒絕了該程序:
<source>(31): error C7625: The type of a coroutine promise return_value or return_void expression must be void
<source>(18): note: see declaration of 'ReturnObject::promise_type::return_value'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.