复制赋值运算符应该通过常量引用传递还是通过值传递?

2024-04-03

在 C++11 之前,复制赋值运算符始终应通过 const 引用传递,如下所示:

template <typename T>
ArrayStack<T>& operator= (const ArrayStack& other);

然而,随着移动赋值运算符和构造函数的引入,似乎有人提倡使用按值传递来进行复制赋值。还需要添加移动赋值运算符:

template <typename T>
ArrayStack<T>& operator= (ArrayStack other);
ArrayStack<T>& operator= (ArrayStack&& other);

上面 2 个运算符的实现如下所示:

template <typename T>
ArrayStack<T>& ArrayStack<T>::operator =(ArrayStack other)
{
    ArrayStack tmp(other);
    swap(*this, tmp);
    return *this;
}

template <typename T>
ArrayStack<T>& ArrayStack<T>::operator =(ArrayStack&& other)
{
    swap(*this, other);
    return *this;
}

在为 C++11 及更高版本创建复制赋值运算符时,使用按值传递是一个好主意吗?什么情况下我应该这样做?


在 C++11 之前,复制赋值运算符始终应通过 const 引用传递

那不是真的。最好的方法始终是使用复制和交换习语 https://stackoverflow.com/a/3279550/560648,这就是您在这里看到的(尽管主体中的实现不是最佳的)。

如果有的话,这是less现在在 C++11 中很有用,因为您也有移动赋值运算符。

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

复制赋值运算符应该通过常量引用传递还是通过值传递? 的相关文章

  • 什么定义了类型的大小?

    ISO C 标准规定 sizeof char lt sizeof short lt sizeof int lt sizeof long 我在 BIT Linux mint 19 1 上使用 GCC 8 大小为long int is 8 我正
  • Visual Studios 2015 中的“恢复 NuGet 包”没有执行任何操作

    我将解决方案从 SVN 拉入 Visual Studios 2015 代码中的一些 使用 引用出现错误 因此我尝试在右键单击 解决方案 中的解决方案时运行 恢复 NuGet 包 选项探索者 这没有任何作用 我必须手动进入 nuget 管理器
  • 如何在 ASP.NET MVC 中将 XML 文件发送到客户端

    在 ASP NET MVC 中 我有一个数据库表 我想在某个视图页面上有一个按钮 如果某个用户单击该按钮 我的应用程序将生成包含数据库中所有行的 XML 文件 然后 应将包含 XML 的文件发送到客户端 以便用户看到下载弹出窗口 同样 我希
  • 如何使用 Entity Framework 和 Identity 解决对象处置异常 ASP.NET Core

    我正在尝试编写一个控制器 该控制器接收来自 AJAX 调用的请求并通过 DBContext 对数据库执行一些调用 但是 当我发出命令时var user await GetCurrentUserAsynch 在对 DBContext 的任何调
  • 如何通过覆盖 MSBuild 目标来防止外语资源生成?

    我正在致力于减少大型 C ASP NET 解决方案的编译时间 我们的解决方案使用通常的 resx 文件方法翻译成大约十几种外语 这些资源文件的解析和编译极大地减慢了我们的编译时间 并且是日常的挫败感 我知道可以创建自定义资源提供程序并摆脱
  • C# 异步任务比同步慢

    你知道为什么同步斐波那契方法比异步 等待更快并且比异步任务更快吗 我在每个项目方法上都使用了异步 所以主要是这是一个非常糟糕的方法 Code static int FibonacciSync int number if number 0 r
  • 头文件中实现的函数的静态与内联

    我想到的方式inline在 C 中用于链接 作用域 我把它放在同一个篮子里extern and static对于全局对象 通常 对于在头文件中实现的函数 我的首选解决方案是将其设为静态 In Foo h static void foo Do
  • 对 ExecuteNonQuery() 的单次调用是原子的

    对 ExecuteNonQuery 的单次调用是否是原子的 或者如果单个 DbCommand 中有多个 sql 语句 那么使用事务是否有意义 请参阅我的示例以进行说明 using var ts new TransactionScope us
  • 如何使用c#从数据桶中获取所有文档?

    如何获取数据桶中的所有文档 我尝试过一个示例 但我只能获得一个特定的文档 这是我的代码 CouchbaseClient oclient oclient new CouchbaseClient vwspace data bucket name
  • 预编译头和 Visual Studio

    有没有办法设置 Visual Studio 解决方案参数 以便它只创建预编译头而不构建整个解决方案 具体来说 它是一个巨大的 C 解决方案 本身有许多项目 谢谢 仅选择 pch 创建者源文件 通常是 stdafx cpp 然后编译该文件 C
  • 从内存流播放视频文件

    只是好奇看看这是否可能 我有一个 Windows 应用程序 它从我的电脑上的 avi 文件读取所有字节 然后将其存储在 byte 中 现在我的内存中有 avi 文件 我想直接从内存将其加载到某种视频播放器控件中 我尝试过使用 wmplaye
  • 为什么像 BindingList 或 ObservableCollection 这样的类不是线程安全的?

    我一次又一次发现自己必须编写 BindingList 和 ObservableCollection 的线程安全版本 因为当绑定到 UI 时 这些控件无法从多个线程更改 我想理解的是why情况就是这样 这是设计错误还是故意的 问题是设计一个线
  • QSpinBox 输入 NaN 作为有效值

    我正在尝试扩展 QSpinBox 以能够输入 NaN 或 nan 作为有效值 根据文档 我应该使用 textFromValue valueFromText 和 validate 函数来完成此操作 但我无法让它工作 因为它仍然不允许我输入除数
  • 如何在 C++ 和 QML 应用程序中使用 qrc?

    我在 Windows7 上用 c qnd Qt Creator QML 编写了 Qt Quick Desktop 应用程序 现在 我必须部署它 并且我需要隐藏 qml 文件和图像 意味着 将它们放入资源等中 我读到有一个很好的方法可以使用
  • ASP.NET MVC 动作过滤器

    有谁知道即使在 CATCH 块中 ActionFilterAttribute 类的 OnResultExecuted 方法是否也会执行 ie CookiesActions public ActionResult Login Usuarios
  • 在 C# .NET 中对非 ASCII 字符进行编码

    我想向我的应用程序发送的电子邮件添加自定义标头 标头名称只能包含 ASCII 字符 但对于值和用户可能会输入 UTF 8 字符 我必须对它们进行 Base64 编码 此外 我还必须将它们解码回 UTF 8 以便在 UI 中向用户显示它们 最
  • 意外的 const 引用行为

    include
  • 在特定线程上运行工作

    我想要一个特定的线程 任务队列并在该单独的线程中处理任务 应用程序将根据用户的使用情况创建任务并将其排队到任务队列中 然后单独的线程处理任务 即使队列为空 保持线程活动并使用它来处理排队任务也至关重要 我尝试过几种实现TaskSchedul
  • 如何重用具有稍微不同的 ProcessStartInfo 实例的 Process 实例?

    我有以下开始的代码robocopy https technet microsoft com en us library cc733145 aspx as a Process 我还需要进行数据库查询以确定每次需要复制哪些目录robocopy被
  • Unity - 在生成时获取随机颜色

    我有一个小问题 我想在我的场景中生成四边形 它们都应该有红色或绿色作为材质 但 Random Range 函数只能是 int 我该如何解决它 void SpawningSquadsRnd rndColor 0 Color red rndCo

随机推荐

  • 如何在 opencv 版本 4.4.0 上正确使用 cv2.findContours()?

    我正在尝试在 opencv 版本 4 4 0 中使用 cv2 findContours 我使用Python版本3 8 5 但它抛出一个错误 我无法弄清楚 我不确定代码有什么问题 这是一些背景 根据 OpenCV 的语法cv2 findCon
  • 查找 iPhone 中两个日期之间的总天数

    我想查找两个日期之间的总天数 例如今天是 01 01 2011 DD MM YYYY 第二个日期是 25 03 2011 我如何找到总天数 NSDate currentdate NSDate date NSLog curretdate is
  • 基于向量键合并数据框

    我是一个绝对的初学者 希望有人能够帮助我解决合并问题 我今晚大部分时间都在解决这个问题 并且迄今为止无法成功地将解决方案应用于此特定示例的类似问题 我制作了一个虚拟数据框和向量来帮助说明我的问题 dumdata lt data frame
  • 如何将日期范围格式化为“MMM,d”?

    我正在尝试显示当前日期的周数以及周数的日期范围 现在日期范围格式是 DateTime 我想将其更改为 Jan 13 关于如何解决这个问题有什么建议吗 override func viewDidLoad super viewDidLoad l
  • Excel:从日期字符串中提取数字

    我有几个格式错误的日期列 我正在尝试将这些列转换为 月 年 和 start day 列 这是一个示例 January 13th 2018 January 13th 14th 2018 January 5th 7th 2018 January
  • 如何实现 Angular 的“盒子里的香蕉”与自定义元素的双向绑定?

    我正在尝试构建一个将由 Angular 应用程序使用的自定义元素 自定义元素将采用一个 prop 并可能对其进行操作 我的理解是我可以使用 盒子里的香蕉 来处理这个绑定 又名
  • 仅当变量为空时才分配变量

    在 Ruby 上有这样的东西 var value 基本上 这意味着 var将被分配 value 除非 var尚未分配 例如 如果 var is nil 我正在 Kotlin 上寻找相同的东西 但到目前为止 最接近的是 elvis 运算符 有
  • 为什么 Jekyll Remote_theme 的 `_config` 文件中的站点变量不可访问?

    According to this https jekyllrb com docs themes pre configuring theme gems40 Jekyll will read in a config yml at the ro
  • python -m:查找模块规范时出错

    根据 python 文档 m标志应该执行以下操作 在 sys path 中搜索指定模块并执行其内容 main module 当我简单地运行我的脚本时python命令 一切正常 由于我现在想从更高级别导入某些内容 因此我必须使用以下命令运行脚
  • Elasticsearch:在关闭数据节点之前撤出所有数据?

    有没有办法告诉节点删除其所有数据 将其分散回其他节点 以便我可以将其关闭 并且在其关闭后不处理重新平衡 重新复制 如果每个分片有 2 个副本 并且删除了一个节点 则某些分片现在只有 1 个实时副本 必须重新复制 如果可以的话 我宁愿在任何一
  • C# 文件创建 - 如何授予 IUSR DELETE?

    我有一个用 C 编写的控制台程序 它在用户 foo 下运行 该程序创建一个文件 在某些情况下 在 IUSR 下运行的 Web 应用程序需要能够删除控制台应用程序创建的文件 我想在创建文件时向 IUSR 授予 DELETE 或任何等效的操作
  • 在 Unity 2D 中拖动对象

    我正在寻找 Unity 2D 的对象拖动脚本 我在网上找到了一个很好的方法 但它似乎只能在Unity 3D中工作 这对我来说不好 因为我正在制作 2D 游戏 而且它不会以这种方式与 墙 发生碰撞 我尝试将其重写为 2D 但使用向量时遇到了错
  • -1.#IND000 在 Visual Studio 调试窗口中意味着什么?

    在Visual Studio 2010监视窗口中 我发现变量的值变成了 1 IND000 这是什么意思 IND 是 Windows 系统中 NaN Not a Number 的表示 IND 不确定形式 主要是非法运算的结果 例如除以零或无穷
  • 在 drupal 中为自定义块创建自定义模板文件

    创建自定义 tpl 文件来为自定义块设置主题的 drupal 方法是什么 具体来说 我尝试以编程方式创建一个块 然后找到一种方法将视图代码与模块 php 代码分开 如果它是一个页面 Drupal theme 将是实现这一目标的非常有效的方法
  • HRegionServer 显示“错误告诉主机我们已经启动”。显示套接字异常:参数无效

    我正在尝试在 3 台 centos 机器上创建一个 hbase 集群 Hadoop v 2 8 0 已启动并在我配置的 HBase v 1 2 5 上运行 Hbase 启动正常 它启动了 HMaster 和区域服务器 但仍然在区域服务器和
  • 各个队列是否可以有死信队列

    目前 我的 ActiveMQ 服务器中有一个名为hello world 每当消息处理失败时 ActiveMQ 都会创建一个名为的默认目录ActiveMQ DLQ 是否可以将该名称更改为类似的名称hello world DLQ 原因是我将来可
  • 将 NPM 包与 Rust 和 Webassemble 结合使用

    有没有办法在 Rust 代码中使用 npm 包和 webassemble 现在使用此模板中已存在的 webpack wasm tool wasm pack plugin 和 wasm bindgen 箱 https github com r
  • 有没有办法重定向到 register_shutdown_function 中的错误页面?

    我试图找到一种干净的方法来处理致命和关键错误 即没有输出缓冲 并且我读到在 register shutdown function 中使用 HTTP 标头是不可能的 问题是 当发生严重错误 例如 服务不可用 时 我想重定向到通用静态错误页面
  • Android Studio 创建新项目时卡住

    安装 Android Studio 并更新到 0 5 9 后 当我尝试创建一个新项目时 在浏览完所有菜单后 我卡在带有进度条的屏幕上 上面写着 正在构建 project name Gradle 项目信息 我让它在那里静置了近 10 分钟 什
  • 复制赋值运算符应该通过常量引用传递还是通过值传递?

    在 C 11 之前 复制赋值运算符始终应通过 const 引用传递 如下所示 template