如何利用模板复制&移动构造函数和赋值运算符?

2024-02-10

考虑以下 C++ 代码以及我试图避免的失败尝试非模板复制和移动构造函数和赋值运算符的偏好 https://stackoverflow.com/a/32539424/1915854:

template<typename T> class A {
public:
    A() { /* implementation here */ }

    // Remove from the overloads the default copy&move constructors and assignment operators
    A(const A&) = delete;
    A& operator=(const A&) = delete;
    A(A&&) = delete;
    A& operator=(A&&) = delete;

    // I want these to be used e.g. by std::vector
    template<typename U> A(const A<U>& fellow) { /* implementation here */ }
    template<typename U> A& operator=(const A<U>& fellow) { /* implementation here */ }

    template<typename U> A(A<U>&& fellow) { /* implementation here */ }
    template<typename U> A& operator=(A<U>&& fellow) { /* implementation here */ }        
};

但是,我收到以下错误

尝试引用已删除的函数

当试图推动时A项目到向量或简单地复制构造,例如:

A<int> a1{};
A<int> a2(a1);

UPDATE1:我需要模板复制和移动构造函数和赋值运算符,因为模板参数实际上只是控制一些缓存,所以A<T1>可以安全地分配给A<T2>.


您可以通过使用替代签名声明已删除的复制构造函数/赋值运算符来使编译器满意,这不会导致选择此重载,但会阻止编译器生成构造函数/赋值运算符:

template<typename T> class A
{ public:
    A() { /* implementation here */ }

    // Remove from the implicit declaration of the default copy&move constructors and assignment operators
    A(A volatile const &) = delete;
    A & operator =(A volatile const &) = delete;

    // I want these to be used e.g. by std::vector
    template<typename U> A(A<U> const & fellow) { /* implementation here */ }
    template<typename U> A & operator =(A<U> const & fellow) { /* implementation here */ return *this;}

    template<typename U> A(A<U> && fellow) { /* implementation here */ }
    template<typename U> A & operator =(A<U> && fellow) { /* implementation here */ return *this; }        
};
int main()
{
    A<int> a1{};
    A<int> a2{a1};
    return 0;
}

在线编译器 https://wandbox.org/permlink/Dxlg8bSECAEunymf

15.8.1 复制/移动构造函数 [class.copy.ctor]
1. 一个非模板构造函数class X如果它的第一个参数是类型,则它是一个复制构造函数X&, const X&, volatile X& or const volatile X&,并且要么没有其他参数,要么所有其他参数都有默认参数

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

如何利用模板复制&移动构造函数和赋值运算符? 的相关文章

随机推荐

  • 在 Rails 的会话中存储对象

    我一直被教导在会话中存储对象是一个坏主意 相反 应该存储 ID 以便在需要时检索记录 但是 我有一个应用程序 我想知道它是否是该规则的例外 我正在构建一个抽认卡应用程序 被测验的单词位于数据库中的一个表中 其架构不会更改 我想存储当前在会话
  • 捕获承诺中的拒绝

    我想保留错误func reject 不直接到onError 通过选择 在我总是让func resolve 并确定后的返回结果yield func 如果我想直接前往onError use throw 想知道有什么更好的主意我可以让func r
  • RedirectToAction 到另一个控制器中的操作不起作用

    在我的 mvc3 POST ActionResult 方法中 我有一部分如下代码 if button Save as Pdf RedirectToAction getPdf Pdf resultObtained 当用户单击按钮时 它会将用户
  • Python配置文件:有什么文件格式推荐吗? INI格式还合适吗?看起来很老派

    我需要存储 Python 应用程序的配置 键 值 并且我正在寻找将这些配置存储在文件中的最佳方法 我遇到了Python的配置解析器 http docs python org library configparser html我想知道 INI
  • 使用 rspec 调用特定 url

    我想在 rspec 中创建一个 get 请求 get exec query gt bla id gt something user id gt user 这会构建一个类似以下的 URL user query something exec q
  • 在静默模式下安装 sqlcmd 接受 EULA

    我正在尝试以静默模式安装 sqlcmd 但我不知道如何自动接受 EULA 我尝试安装的文件名为 MsSqlCmdLnUtils msi 从 MS 下载中心下载 这是我到目前为止所尝试过的 通过谷歌找到 msiexec i MsSqlCmdL
  • 隐藏部分溢出的元素

    我正在寻找一种纯 CSS 方法来隐藏已部分溢出其容器的 div 3 请参阅附图 这是一个可行的解决方案 它将完全隐藏不适合其父级固定高度的项目 Codepen https codepen io PhilippeVay pen JyBQOy
  • 用模型方法查询?

    我在仅对活动对象执行查询时遇到问题 我在数据库中没有活动列 相反 在模型游戏上 我有以下方法 def complete self winner true false end 这样如果一场比赛有赢家 complete 将返回 true 我想查
  • 微服务异步操作HTTP响应

    我们正在构建一个微服务应用程序 客户可以在其中创建projects 下图展示了该过程的技术流程 我的问题 API 网关应向客户端返回什么 HTTP 响应 步骤 1 我最初的想法是返回 202 但问题是我不知道Location yet pro
  • SQL - 两个相互依赖的外键

    目前的结构如下 Table RowType RowTypeID Table RowSubType RowSubTypeID FK RowTypeID Table ColumnDef FK RowTypeID FK RowSubTypeID
  • 使用 otool(递归)查找应用程序所需的共享库

    我有一个 Cocoa 应用程序 它使用 otool 来查找应用程序正常运行所需的共享库 例如 假设我在使用 QTKit framework 的应用程序上运行 otool L 我得到了程序使用的共享库的列表 包括 Cocoa framewor
  • 无法加载文件或程序集“Microsoft.Web.Deployment,版本=9.0.0.0”

    我有 VS 2013 Ultimate 我的远程服务器是 IIS 7 5 并启用了远程部署 我已通过 Web Platform Installer 4 6 安装了 Web Deploy Tool 2 1 并且安装成功 当我尝试在发布工具上验
  • 如何告诉 DBD::mysql mysql.sock 在哪里?

    将 DBD mysql 与 DBI 一起使用 尝试连接到数据库时出现以下错误 DBI connect database mydb host localhost someuser failed Can t connect to local M
  • pyqtSlot 的功能[重复]

    这个问题在这里已经有答案了 我刚刚阅读了有关 pyqt5 按钮的教程here https pythonspot com en pyqt5 buttons 代码如下 有一个问题是关于button clicked connect self on
  • Grails - 跨控制器代码,在每个请求上执行

    有没有办法在调用任何控制器操作之前执行某些代码 我需要根据获取参数的值设置会话变量 而不考虑调用哪个控制器 当然 一旦完成此处理 请求需要按照其正常方式到达相应的控制器 操作 Thanks 听起来你想使用filter http grails
  • 树的等级是多少? (如树ADT)[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 据我所知 一个节点的度数是它拥有的子节点的数量 但是 我们如何定义树的度呢 基本上 树的度是它的子节点的总数 即源自它的节点的总数 树的叶
  • HTTP 响应何时完成?

    我正在 NET 中编写一个简单的 HTTP 客户端用于学习目的 我正在使用 NETSocket http msdn microsoft com en us library system net sockets socket aspx类 最终
  • 在工厂模式中使用反射[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在工厂模式中使用反射是一个好的实践吗 public class MyObjectFactory private Party party publ
  • 获取iscsi设备的目标IP地址

    假设我有一个 iSCSI 设备 dev sdat 我如何知道其目标的IP地址 目标驱动程序是 SCST 启动程序是 iSCSI 我只知道一个名为 dev sdat仅此而已 那么如何获取目标的IP地址呢 嗯 我并不为此感到自豪 但它完成了工作
  • 如何利用模板复制&移动构造函数和赋值运算符?

    考虑以下 C 代码以及我试图避免的失败尝试非模板复制和移动构造函数和赋值运算符的偏好 https stackoverflow com a 32539424 1915854 template