接收参数并移动可能失败的函数的语义(强大的异常安全性)

2024-01-12

我有一个函数,可以对作为接收器参数传入的大量数据进行操作。我的BigDatatype 已经支持 C++11,并且带有功能齐全的移动构造函数和移动赋值实现,因此我可以摆脱困境,而不必复制该死的东西:

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...
}

当然,这是行不通的。

Since I moved当我到达异常处理程序时,我的数据进入处理函数,b将无法再使用。

这可能会大大降低我对按值传递接收器参数的热情。

那么问题来了:在现代 C++ 代码中如何处理这样的情况?如何检索对先前移至无法执行的函数中的数据的访问权限?

您可以更改两者的实现和接口BigData and processBigData如你所愿。然而,最终的解决方案应该尽量减少原始代码在效率和可用性方面的缺陷。


我同样对这个问题感到困惑。

据我所知,当前最好的习惯用法是将值传递划分为一对引用传递。

template< typename t >
std::decay_t< t >
val( t && o ) // Given an object, return a new object "val"ue by move or copy
    { return std::forward< t >( o ); }

Result processBigData(BigData && in_rref) {
    // implementation
}

Result processBigData(BigData const & in_cref ) {
    return processBigData( val( in_cref ) );
}

当然,在异常发生之前,参数的一些部分可能已经被移动了。问题会传播到任何地方processBigData calls.

我有一个灵感,想要开发一个对象,在某些例外情况下,它可以自行返回其源头,但这是我的一个项目中即将出现的特定问题的解决方案。它最终可能过于专业化,或者根本不可行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

接收参数并移动可能失败的函数的语义(强大的异常安全性) 的相关文章

随机推荐

  • 在 Visual Studio Code 中使用奇异容器作为 python 解释器

    我通过 VScode 远程 ssh 连接到 HPC 环境 并希望直接在 VScode 中运行 python 代码以进行测试 我想将 python 解释器设置为一个在执行时运行 python 的奇点容器 这是通过在容器的 def 文件中添加以
  • 如何替换 UITableViewCell 中的 imageView?

    我有一个继承自 UIImageView 的类型 但添加了一些额外的功能 我想将它作为图像视图放入我的 UITableViewCells 中 但不想做一个全新的单元格布局 以便我可以添加此图像 当我尝试直接设置图像视图时 self image
  • 如何继承父级到两个具有相同字段的视图控制器? [复制]

    这个问题在这里已经有答案了 我在情节提要上有 2 个 viewController 每个都有UITextField同名 我有一个父类 它保存的属性名称UITextField 父类继承泛型UIViewController班级 每个 我的 vi
  • 谓词缓存

    是否有 Prolog 实现或库可以缓存谓词 或者您会使用assertz 1 和retract 1 来实现一个例如FIFO 缓存 如下所示 dynamic cache 1 ccall G cache G ccall G cache G cal
  • JavaScript/PHP 注册电子邮件确认工作流程的安全注意事项

    我正在为我的 JavaScript PHP 网站构建用户注册工作流程 用户注册后 他们就会被添加到数据库中 处于非活动状态 然后 用户将收到一封确认电子邮件 这需要他们单击确认链接 目前 确认链接会将用户重定向到站点登录页面 并以确认码作为
  • Android N Preview 模拟器崩溃

    我在新的 Android N 预览模拟器上一开始就遇到了这个崩溃 qemu fatal goldfish tty read Bad offset 20 RAX 0000000000000009 RBX 0000000000000000 RC
  • Java UTF-8 奇怪的行为

    我正在尝试用 Java 解码一些 UTF 8 字符串 这些字符串包含一些组合 unicode 字符 例如 CC 88 组合分音符 根据 字符顺序似乎没问题http www fileformat info info unicode char
  • Java Swing:清除 JPanel 中与 JLayeredPane 中的其他 JPanel 重叠的自定义绘制

    我有一个包含三个 JPanel 的 JLayeredPane 其中两个重叠 我正在向其绘制形状 重叠的两个 JPanel 之一需要清除绘制到其上的每个形状 而不影响绘制到其下方的 JPanel 的形状从屏幕上消失 目前我正在使用这样的东西
  • 将 Opencv Hsv 转换为等价于 Matlab Hsv

    我必须使用opencv开发android代码 代码相当于MATLAB 因为我必须读取图像并将其转换为 HSV 我已经使用以下方法完成了此操作 Imgproc cvtColor temp hsv Imgproc COLOR RGB2HSV 当
  • 如何在 log4j2 属性中设置类的日志级别

    在 log4j 中 我可以在属性文件中指定一个类以在调试级别进行日志记录 如下所示 log4j logger com mycompany mypackage ClassName DEBUG 我如何在 log4j2 中执行此操作 注意我仍然需
  • 角材质内的 routerLink

    a a
  • 数据库设计:成员表是单独的还是全部在一张表中?

    我想创建一个包含个人信息和登录详细信息的朋友表 将members表分成2个表更好 一个包含最少的细节 其次是其他细节 还是留在一张桌子上 我有很多包含成员外键的表 这在很大程度上取决于那些 其他 细节是什么 这是一个常见且有趣的问题 乍一看
  • 方法参数级别的 @ModelAttribute 注释的含义是什么?

    Spring 3 参考资料告诉我们 当你把它放在一个方法上时 范围 ModelAttribute映射一个 模型属性具体 带注释的方法参数 我不明白这个魔咒 因为我确定模型对象的别名 如果使用则为键值 ModelMap作为返回类型 在执行请求
  • 如何忽略已经提交的文件?

    之前 以下是我的 gitignore file config database yml DS Store 后来我创建了一个app config yml文件放在 config 目录中并提交 现在 我意识到我不需要app config ymlg
  • 无法从 onBackgroundMessage 启动 Activity

    刚刚创建了一个新的 Flutter 应用程序 最终当我收到通知时尝试打开我的应用程序或显示全屏活动 例如电话 现在只是尝试控制台登录通过后台消息处理程序调用的本机类 当我发送通知时收到此错误 您看到我做错了什么吗 我应该有不同的方法来处理这
  • SQL Server 快进游标

    人们普遍认为 应尽可能避免在存储过程中使用游标 用基于集合的逻辑等替换 如果您需要迭代某些数据 并且可以以只读方式执行 那么快进 只读前进 游标是否比 while 循环效率更高或更低 根据我的调查 光标选项通常速度更快 并且使用更少的读取和
  • 如何在 Thymeleaf 中使用 Dates.Format 和区域设置

    我正在尝试使用 Thymeleaf 中的区域设置格式化日期 我已经使用了dates format td td td td 但以上都不起作用 我基于这个已经解决的问题https github com thymeleaf thymeleaf e
  • .NET 中的货币格式

    我试图了解货币格式在 NET 框架中的工作原理 据我了解 Thread CurrentCulture NumberFormatInfo CurrencySymbol 包含当地文化的货币符号 但在我看来 在现实世界中 特定文化和货币符号之间并
  • 方法头中“静态”的含义是什么?

    我想了解 writeNumbers 方法标头中的 static 一词有何作用 public class DisplayClass param args public static void main String args writeNum
  • 接收参数并移动可能失败的函数的语义(强大的异常安全性)

    我有一个函数 可以对作为接收器参数传入的大量数据进行操作 我的BigDatatype 已经支持 C 11 并且带有功能齐全的移动构造函数和移动赋值实现 因此我可以摆脱困境 而不必复制该死的东西 Result processBigData B