std::move 位于移动赋值运算符内

2023-12-23

我读到另一个问题 https://stackoverflow.com/a/5976829/440509在实现移动构造函数时,最好对初始化列表中的每个成员进行 std::move ,因为如果该成员恰好是另一个对象,则将调用该对象的移动构造函数。就像这样...

//Move constructor
Car::Car(Car && obj)
    : 
    prBufferLength(std::move(obj.prBufferLength)), 
    prBuffer(std::move(obj.prBuffer)) 
{
    obj.prBuffer = nullptr;
    obj.prBufferLength = 0;
}

然而,在我见过的所有示例移动赋值运算符中,都没有提到出于同样的原因使用 std::move 。如果成员是一个对象,那么应该使用 std::move 吗?就像这样...

//Move assignment
Car Car::operator=(Car && obj)  
{
    delete[] prBuffer;

    prBufferLength = std::move(obj.prBufferLength);
    prBuffer = std::move(obj.prBuffer);

    obj.prBuffer = nullptr;
    obj.prBufferLength = 0;
    return *this;
}

UPDATE:

我很欣赏在我选择的示例中不需要使用 std::move (很差),但是我对成员是否是对象感兴趣。


阅读链接的问题后,我可以看到第二个投票最多的答案中的建议是使用std::move在移动构造函数的初始值设定项列表中,因为无论它是否是原始类型,它都会做正确的事情。我有点不同意这一点,并认为你应该只打电话std::move在适当的情况下,但这取决于个人喜好。

另外,对于您的移动赋值运算符,您的方式很好,尽管我认为不必要的调用std::move应该亲自删除。另一种选择是使用std::swap这将为您做正确的事情。

Car Car::operator=(Car && obj)  
{
    std::swap(this->prBufferLength, obj.prBufferLength);
    std::swap(this->prBuffer, obj.prBuffer); 
    return *this;
}

上面的移动赋值运算符和你的移动赋值运算符之间的区别在于内存的释放是delayed虽然您的版本会立即释放内存,但这在某些情况下可能很重要。

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

std::move 位于移动赋值运算符内 的相关文章

  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • data.table 中的“.N”是什么意思?

    我有一个数据表dt library data table dt data table a LETTERS c 1 1 3 b 4 7 a b 1 A 4 2 A 5 3 B 6 4 C 7 的结果dt N by a is a N 1 A 2
  • Facebook 和 Google 登录不适用于上传到 Firebase App Distribution 的 Android AAB 版本

    Solved The 页面已更新 当您将 AAB 上传到 App Distribution 时 Google Play 会自动 使用测试应用程序签名密钥证书对生成的 APK 进行签名 出现提示时 您必须向 API 提供商注册您的应用程序 如
  • 使用 destroy() 命令时 Perl/Tk 内存泄漏

    我遇到了在 Unix 上运行的 Perl Tk 存在大量泄漏的问题 由于某些限制 我无法发布大部分代码 但我已经能够确定导致内存泄漏的原因并创建一个具有相同症状的小程序 基本上我正在运行一个 GUI 其中的框架被定期销毁和重新填充 这似乎会
  • 无法解析模块...急速模块图中不存在

    我是 ReactNative 的初学者 我正在创建一个 Twitter 克隆来练习 我已经开发了第一个应用程序 没有任何问题 但自从我开始新项目以来 在项目中添加自定义模块后 我收到此错误消息 在本例中 我想将样式表导入到我的自定义推文组件
  • 作为 Web 服务的 C++ OpenGL 应用程序

    我们用 C 创建了一个 OpenGL 应用程序 可以可视化一些物理模拟 基本应用程序包含在一个 DLL 中 由简单的 GUI 使用 它目前运行在台式电脑上 但我们有将其转变为网络服务的想法 由于模拟需要专用硬件 因此用户可以通过他 她的浏览
  • Ruby on Rails 301 重定向

    我向某些模型添加了 slugs 但由于 SEO 我需要从旧链接进行 301 重定向 老的 http host com foo 1 new http host com foo foo slug 问题 这种情况下如何实现301重定向呢 是否可以
  • 使用axios发送请求时如何设置代理?

    我正在使用一个名为 并发 的包在本地主机上同时运行我的客户端和服务器 客户端在端口 3000 上运行 而服务器在端口 5000 上运行 我已按以下方式在服务器的 package json 中设置代理 proxy https localhos
  • 将全局样式表移至 中的样式组件上方

    我目前import在我的一个组件中使用 CSS 文件 这些样式表添加为link标签在 并将在全球范围内推出 import src styles normalize module css 我也在使用样式组件 目前 link全局CSS生成的标签
  • 游戏关卡的数据结构

    我正在使用 JavaScript 创建一个平台游戏canvas完全基于图块 在游戏中存储物品块 墙壁 地板 物品 的最佳方法是什么 问题是每块瓷砖都可以被摧毁或创建 目前我有一个 2D 数组 因此我能够快速检查某个项目是否位于特定的 X 和
  • 如何使用 javascript api v3 在 flash 中显示 Google 地图?

    我知道有一个用于 flash 的 api 但它已被弃用 我如何使用 javascript api v3 在 flash 中显示谷歌地图 你可以看看使用iFrame https github com flex users flex ifram
  • 在运行时以编程方式向 MVC 模型添加属性

    我试图在应用程序运行时以编程方式在模型中创建属性 我试图遵循达林 迪米特洛夫 Darin Dimitrov 在这篇文章中的回答如何在 MVC 3 中基于 XML 文件动态创建控件 https stackoverflow com questi
  • 我可以使用 Clojure 的派生来创建 defrecord 类类型的层次结构吗?

    我想做这样的事情 defrecord Base defrecord Person defrecord Animal derive Person Base derive Animal Base isa Animal Person 这可能吗 U
  • 获取带有 className 的行

    如何获取具有特定 className 的表中的第一行 var rows tr tbl var rows tr classname first tbl or var rows tr classname tbl first 文档在这里 http
  • 如果存在内部类,包含美元符号的 Java 类名将无法编译

    我定义了以下 Java 类 mac grek javajunk grek cat A B java class A B mac grek javajunk grek cat A java public class A public stat
  • 在单个 JBoss 实例上设置多个端口?

    问题背景 情况是这样的 我们正在运行一个来自战争的模拟器 servlet 我们正在模拟的 servlet 在一台机器上有许多实例 按端口号进行区分 我们只想部署一场可以通过许多端口访问的战争 到目前为止我们所拥有的 使用javaFilter
  • 并行处理多个文件的 bash 脚本

    我读过有关该主题的类似问题 但没有一个可以帮助我解决以下问题 我有一个 bash 脚本 如下所示 bin bash for filename in home user Desktop emak fa do mkdir filename cd
  • Rails 和页面特定的 Javascript

    好吧 我意识到这个问题已经被问过很多次了 但答案似乎从未解决我对此的问题 我有一个 js 文件 我只想将其包含在特定页面上 有许多回复建议我将文件放入文件夹中 然后在清单文件中仅引用这些文件夹 例如这个 Railscast 大约 06 20
  • 使用 Angular 2 处理 HTML5 事件(onfocus 和 onfocusout)

    我有一个日期字段 我想默认删除占位符 我正在使用 JavaScriptonfocus and onfocusout删除占位符的事件 任何人都可以帮助使用 angular2 指令吗
  • 为什么数组名称后面有括号和点而不是方括号?

    访问数组中的元素时 方括号的使用方式如下 X is an int and Numbers is an int array X Numbers 8 然而 在阅读其他人的代码时 我有时会发现以下语法 PBox SBox1 SBox2 are a
  • std::move 位于移动赋值运算符内

    我读到另一个问题 https stackoverflow com a 5976829 440509在实现移动构造函数时 最好对初始化列表中的每个成员进行 std move 因为如果该成员恰好是另一个对象 则将调用该对象的移动构造函数 就像这