簡體   English   中英

C++協程的return_void和return_value的返回類型

[英]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 中,返回類型為intreturn_void也適用。 這個對嗎? 如果是,

  1. 為什么它同時適用於 void 和非 void 返回類型?
  2. 在非 void 返回類型的情況下, return_void的返回值會發生什么?

return_value

在 gcc 中可以觀察到與方法return_value類似的效果。 如果return_value的返回數據,有沒有辦法直接訪問這個返回的數據,類似於正常的子程序/函數的返回值?

檢查編譯器資源管理器上的代碼

更新:

在@useless 的建議之后,我將[[nodiscard]]添加到return_voidreturn_value中,並使用非 void 返回類型並啟用-Wall標志。

令人驚訝的是,對於return_voidreturn_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.

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