我正在嘗試撰寫一個回傳未來的相當簡單的方法。一個 lambda 設定了未來。這是一個最小的例子。實際上,可能會在不同的執行緒中呼叫 lambda,等等。
#include <future>
std::future<std::error_code> do_something() {
std::promise<std::error_code> p;
auto fut = p.get_future();
auto lambda = [p = std::move(p)] {
std::error_code error;
p.set_value(error);
};
lambda();
return std::move(fut);
}
int main() { return do_something().get().value(); }
出于某種原因,我收到了型別錯誤。VSCode 智能感知 說:
沒有多載函式的實體“
std::promise<_Ty>::set_value [with _Ty=std::error_code]”與引數串列和物件匹配(物件具有防止匹配的型別限定符)--引數型別是:(std::remove_reference_t<std::error_code &>)--物件型別是:const std::remove_reference_t<std::promise<std::error_code> &>
MSVC 編譯器說:
錯誤 C2663:“
std::promise<std::error_code>::set_value”:2 個多載對“this”指標沒有合法的轉換
我真的不明白 VS Code 錯誤。是說它認為error是 aconst promise<error_code>嗎?如何正確呼叫lambda 捕獲中的 dset_value承諾move?
uj5u.com熱心網友回復:
默認情況下,lambda 將所有捕獲的值(非參考)存盤為const值,您無法修改它們。但是 lambda 支持關鍵字mutable,你可以這樣添加:
[/*...*/](/*...*/) mutable { /*...*/ }
這將允許 lambda 的內部主體修改其所有值。
如果由于某種原因您不能使用mutable,那么您可以使用其他解決方法:
[/*...*/, p = std::make_shared<ClassName>(std::move(p)), /* ... */](/*...*/) {/*...*/}
換句話說,將您移動的值包裝到std::shared_ptr 中,如果您愿意,也可以使用std::unique_ptr。
包裝成共享指標解決了這個問題,因為共享指標(也是唯一的)允許修改它的底層物件值,即使指標本身是const.
不要忘記在 lambda 的主體內部取消參考p作為指標,換句話說,如果您使用了p.SomeMethod(),現在您必須使用p->SomeMethod()(with->運算子)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/364336.html
