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 位于移动赋值运算符内 的相关文章

  • .NET 单点登录

    我一直在尝试使用 C 为 NET Web 应用程序实现 WEB SSO 服务提供程序插件 我将使用 shibboleth 身份提供商 我已经使用 OpenSAML 库为 java 应用程序实现了相同的功能 我想知道在 NET 应用程序中使用
  • Linq - 从表达式 创建表达式

    我有一个谓词Expression
  • 是否有可能劫持标准输出

    我正在尝试使用 C 重定向 Windows XP 上已运行进程的标准输出 我知道如果我自己生成进程 我可以做到这一点 但对于这个应用程序 我更喜欢一个 监听器 我可以附加到另一个进程 这在纯 Net 中可能吗 如果不可能 在 Win32 中
  • Caliburn.Micro - ShowDialog() 如何关闭对话框?

    EDIT 新信息 刚刚设法让记录器工作 老实说 我不知道 cm 有一个 并且在尝试使用时收到此消息TryClose TryClose requires a parent IConductor or a view with a Close m
  • 生成多个随机数

    我想生成 25 个唯一的随机数并将它们列在控制台中 数字的长度应至少为 10 个字符 有什么简单的方法可以做到这一点吗 尝试将数字构建为字符串 并使用 HashSet 确保它们是唯一的 Random random new Random Ha
  • 深拷贝和动态转换 unique_ptr

    假设我有一个如下所示的类 class A virtual A class B public A class C public A 我还有一个 unique ptr 向量 它是这样声明的 std vector
  • Visual Studio 中列表框的上移、下移按钮[重复]

    这个问题在这里已经有答案了 我正在尝试制作一个上移按钮和一个下移按钮 以移动 Microsoft Visual Studio 2012 中列表框中的选定项目 我已经在 WDF jquery winforms 和其他一些表单中看到了其他示例
  • 对作为函数参数传递的指针使用删除

    删除作为函数参数传递的指针是否可以 并且合法 如下所示 include
  • 如何减少 MinGW g++ 编译器生成的可执行文件的大小?

    我有一个简单的 Hello world C 程序 在 Win XP 下由 MinGW g 编译器编译为 500kB 可执行文件 有人说这是由于iostream的库和静态链接libstdc dll Using s链接器选项有点帮助 减少了 5
  • 如何自定义 Google 测试失败消息?

    我编写了一个如下所示的 Google 测试 它将一些计算值与 CSV 文件中预期存储的值进行比较 class SampleTest public testing Test public void setupFile const std st
  • 应用程序处于中断模式。您的应用程序已进入中断状态,

    我发现自己遇到了同样的问题here https stackoverflow com questions 36204009 disable break mode page in vs2015 我在 dll 中使用 Windows 窗体 这是针
  • 调用异步方法在视图模型的构造函数中加载数据有警告

    我的视图包含一个 ListView 它显示来自互联网的一些数据 我创建一个异步方法来加载数据并在我的视图模型的构造函数中调用该方法 它有一个警告提示我现在使用await关键字 还有其他解决方案可以在构造函数中异步加载数据吗 有几种可以应用的
  • 我可以将 UseCSharpNullComparisonBehavior 用于单个查询吗?

    我有一个查询 该查询曾经是存储过程 现已转换为 EF 查询 现在已经超时了 使用 SQL Profiler 我可以看到生成的 SQL 的唯一区别是 EF 转变的新行为entity Property value into entity Pro
  • 配置:错误:无法运行C编译的程序

    我正在尝试使用 Debian Wheezy 操作系统在我的 Raspberry Pi 上安装不同的软件 当我运行尝试配置软件时 我尝试安装我得到此输出 checking for C compiler default output file
  • 更改 Xamarin.Forms 应用中顶部栏和底部栏(ControlsBar、StatusBar)的颜色

    无论如何 即使后面需要特定于平台的代码 也可以更改顶部栏 蓝色的 和底部栏 黑色的 的颜色吗 我希望添加对浅色和深色模式的支持 因此我希望能够在运行时更改它 有可能的 Android Using Window SetStatusBarCol
  • 传递数组时在 C 中的函数参数中强制指定数组大小

    Context 在 C 中 我有一个以数组作为参数的函数 该参数用作该函数的输出 输出的大小始终相同 我会 让阅读代码的人清楚所需的大小 不过它已经在函数注释中了 理想情况下 编译会输出警告或错误 这样我就可以在编译时而不是运行时防止出现问
  • Gremlin.net 文本包含等效项

    我正在使用 Gremlin net 库连接到 janus 图形服务器 我使用 cassandra 和弹性搜索进行数据存储和索引 在我使用的 gremlin 语言和 gremlin 控制台中文本包含在属性的文本中进行搜索 我正在使用混合索引
  • C 变量声明的效率 [重复]

    这个问题在这里已经有答案了 例如 在 C 中声明一个变量需要多长时间int x or unsigned long long var 我想知道它是否会让我的代码在类似的事情中更快 for conditions int var 0 code 这
  • Xcode 7 调试器不会中断内联标头函数

    过去五年我一直在各种 C 项目中使用 Xcode 没有出现这个问题 今天 我打开了一个较旧的项目 大约 2 年前 并尝试通过在该函数中放置一个活动断点来调试头文件中的内联函数 由于某种原因 调试器不会中断此代码 但是 如果我在调用该函数的
  • 卸载程序

    我正在尝试使用此代码卸载程序 但它似乎不起作用 我尝试过其他答案 但似乎也不起作用 有人可以帮助我吗 我正在尝试按给定名称 displayName 卸载该程序 例如 我给出 displayName Appname 那么此代码应该从我的计算机

随机推荐

  • 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 因为如果该成员恰好是另一个对象 则将调用该对象的移动构造函数 就像这