簡體   English   中英

move-semantics和std :: future

[英]move-semantics and std::future

我自己研究了C ++ 11的特性,並認識到了移動語義,並試圖將它應用於至少處理容器或“更大”對象的每個函數。 現在我發現了一些我希望並行運行的任務,所以我會使用std :: future,但這些任務處理容器(在我的情況下返回一個容器)。 所以我有這個偽代碼:

std::future<container&&> c = std::async([]()->container&&{ /* stuff return a local container object */ });

並且知道我問自己如何控制容器rval ref的壽命? 如果我是對的並且在調用c.get()之前任務已完成,則將其存儲。 存儲的值是否仍包含可用對象?

這確保了它的壽命嗎?

std::future<container> c = std::async([]()->container&&{ /* same stuff -- ^ -- */ });
container cc = std::move(c.get());

看起來你的移動語義錯誤。

您應該按值返回,而不是通過右值引用返回,並讓移動構造函數確保按值返回是有效的。 否則,您可能會將懸掛引用返回到不再存在的對象。 移動語義的要點是使值按價值傳遞對象,右值引用只是啟用它的語言特性,目標不應該是為了它們自己而使用右值引用。

換句話說,您希望數據從lambda主體移動到lambda的返回值,轉換為將來的存儲值。 會移動數據。 你不想傳遞一個不會移動任何東西的引用(你可以使用左值引用在C ++ 03中通過引用傳遞東西!)

你的lambda應該按值返回, future應該按值存儲:

std::future<container> c = std::async([]()->container{ /* stuff */ });

並且您不需要使用std::move ,唯一的期貨將存儲的值作為右值返回,因此您可以自動從它移動而不使用std::move將其轉換為右值:

container cc = c.get();   // cc will be move constructed

暫無
暫無

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

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