我有一个函数可以处理作为接收器参数传入的大量数据。我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