为可能失败的函数(强异常安全)接收参数和移动语义 [英] Sink arguments and move semantics for functions that can fail (strong exception safety)
本文介绍了为可能失败的函数(强异常安全)接收参数和移动语义的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个函数,对作为sink参数传入的大块数据进行操作。我的 BigData
类型已经是C ++ 11感知的,并且具有完全功能的移动构造函数和移动赋值实现,所以我可以离开,而不必复制的东西: / p>
结果processBigData(BigData);
[...]
BigData b = retrieveData();
结果r = processBigData(std :: move(b));
这一切都很好。但是,我的处理函数可能会偶尔在运行时失败,导致异常。这不是一个真正的问题,因为我只能修复的东西,并重试:
BigData b = retrieveData
结果r;
try {
r = processBigData(std :: move(b));
} catch(std :: runtime_error&){
r = fixEnvironmnentAndTryAgain(b);
//等等,有些不对了...
}
当然,这不会工作。
由于我将数据移入处理函数,在我到达异常时
这可能会大大降低我对传递sink参数的热情。值。
这里是一个问题:如何在现代C ++代码中处理这种情况?
您可以更改 BigData
processBigData
。然而,最终的解决方案应该尝试最小化关于效率和可用性的原始代码的缺点。解决方案
显然,最近的CppCon 2014. Herb Sutter在他的闭幕词中总结了最新的状态,
他的结论很简单:不要使用pass-by-value