我有一個函數可以處理作爲接收器參數傳入的大量數據。我BigData
類型已經是C++ 11感知,並配有功能齊全的移動構造函數和移動分配的實現,這樣我就可以脫身,而無需複製該死的東西:Sink參數並移動可能失敗的函數的語義(強壯的異常安全性)
Result processBigData(BigData);
[...]
BigData b = retrieveData();
Result r = processBigData(std::move(b));
這一切工作完全正常。但是,我的處理函數可能會在運行時偶爾失敗,從而導致異常。這不是一個真正的問題,因爲我只能修復內容並重試:
BigData b = retrieveData();
Result r;
try {
r = processBigData(std::move(b));
} catch(std::runtime_error&) {
r = fixEnvironmnentAndTryAgain(b);
// wait, something isn't right here...
}
當然,這是行不通的。
由於我移動了我的數據進入處理函數,到達異常處理程序時,b
將不再可用。
這樣做可能會大大降低我對按值收取匯率參數的熱情。
所以這裏是一個問題:如何在現代C++代碼中處理這種情況?如何檢索先前移入未能執行的函數的數據訪問?
您可以根據需要更改BigData
和processBigData
的實現和接口。然而,最終的解決方案應該儘量減少原有代碼在效率和可用性方面的缺陷。
重要的問題是,結果是否包含b的移動資源或僅基於它? – IdeaHat 2014-09-04 14:05:41
@MadScienceDreams「Result」只是從'b'計算出來的,它並不包含對原始'b'的引用或拷貝。 – ComicSansMS 2014-09-04 14:06:56
@ComicSansMS但它是否包含移動(而不是複製)的內容? – Potatoswatter 2014-09-04 14:09:05