模板赋值运算符重载之谜

2024-04-24

我有一个简单的结构Wrapper,通过两个模板化赋值运算符重载来区分:

template<typename T>
struct Wrapper {

  Wrapper() {}

  template <typename U>
  Wrapper &operator=(const Wrapper<U> &rhs) {
    cout << "1" << endl;
    return *this;
  }
  template <typename U>
  Wrapper &operator=(Wrapper<U> &rhs) {
    cout << "2" << endl;
    return *this;
  }
};

然后我声明 a 和 b:

Wrapper<float> a, b;
a = b;

指派b to a将使用上面的非常量模板化赋​​值运算符重载,并显示数字“2”。

让我困惑的是:如果我声明c and d,

Wrapper<float> c;
const Wrapper<float> d;
c = d;

并分配d to c,两个赋值运算符重载均未使用,并且不显示任何输出;因此调用默认的复制赋值运算符。为什么分配d to c不使用const提供的重载赋值运算符吗?或者相反,为什么分配b to a not使用默认的复制赋值运算符?


为什么分配d to c不使用const提供的重载赋值运算符吗?

仍然会生成隐式声明的复制赋值运算符,其声明如下:

Wrapper& operator=(const Wrapper&);

运算符模板不会抑制隐式声明的复制赋值运算符的生成。由于参数(const 限定的Wrapper) 与该运算符的参数完全匹配 (const Wrapper&),它是在重载决策期间选择的。

未选择运算符模板,并且不存在歧义,因为在所有其他条件相同的情况下,非模板在重载解析期间比模板更匹配。

为什么分配b to a不使用默认的复制赋值运算符?

参数(非 const 限定Wrapper) 是一个更好的匹配操作员模板,需要Wrapper<U>&比隐式声明的复制赋值运算符(需要一个const Wrapper<U>&.

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

模板赋值运算符重载之谜 的相关文章

  • Visual Studios 2015 中的“恢复 NuGet 包”没有执行任何操作

    我将解决方案从 SVN 拉入 Visual Studios 2015 代码中的一些 使用 引用出现错误 因此我尝试在右键单击 解决方案 中的解决方案时运行 恢复 NuGet 包 选项探索者 这没有任何作用 我必须手动进入 nuget 管理器
  • 无法使用c#更改视频捕获分辨率

    我正在尝试使用 C 中的 DirectShowNet 更改默认网络摄像头分辨率 据我所知 我需要通过调用 windows win32 api dll 中内置的 VideoInfoHeader 类来更改它以进行 avi 捕获 我有来自 Dir
  • getline 之后返回到文件开头

    所以我已经从文件中读取了所有行 while getline ifile line logic 其中 ifile 是 ifstream line 是字符串 我的问题是我现在想再次使用 getline 并且似乎无法返回到文件的开头 因为运行 c
  • Boost MPI 在监听列表时不会释放资源?

    这是一个后续问题如何释放 boost mpi request https stackoverflow com questions 44078901 how do i free a boostmpirequest 我在监听列表而不是单个项目时
  • C# 中 PKCS11Interop 库的线程安全使用 [已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在使用 PKCS11Interop 在 HSM 内执行密钥管理操作 我使用的 HSM 是 Thales PCI Express 下面是
  • 我可以将 char 或 DateTime 设置为 null 吗?

    我可以将 null 设置为char数据类型 并且DateTime在 C 中 多谢你们 这是不可能的 它是一个值类型 使用 char myChar null DateTime myDate null 这相当于 Nullable
  • 如何使用 CUDA/Thrust 对两个数组/向量根据其中一个数组中的值进行排序

    这是一个关于编程的概念问题 总而言之 我有两个数组 向量 我需要对一个数组 向量进行排序 并将更改传播到另一个数组 向量中 这样 如果我对 arrayOne 进行排序 则对于排序中的每个交换 arrayTwo 也会发生同样的情况 现在 我知
  • 检测反射 DLL 注入

    在过去的几年中 恶意软件 以及一些渗透测试工具 如 Metasploit 的 meterpreter 负载 已经开始使用反射 DLL 注入 PDF http www harmonysecurity com files HS P005 Ref
  • asp.net core http 如果没有内容类型标头,则删除 `FromBody` 忽略

    我在 http 中使用 bodyDELETE要求 我知道目前删除主体是非标准的 但是允许的 使用时出现问题HttpClient它不允许删除请求的正文 我知道我可以使用SendAsync 但我宁愿让我的 API 更加灵活 我希望这个机构是可选
  • 检查两个函数或成员函数指针的签名是否相等

    我编写了一些代码来检查自由函数的签名是否等于成员函数的签名等 它比较提取的返回类型和函数参数 include
  • ASP.NET MVC 动作过滤器

    有谁知道即使在 CATCH 块中 ActionFilterAttribute 类的 OnResultExecuted 方法是否也会执行 ie CookiesActions public ActionResult Login Usuarios
  • 查找方法不适用于 EF6.1 模拟

    我已经使用这些 msdn 指南设置了模拟 使用模拟框架进行测试 EF6 及以上 http msdn microsoft com en us data dn314429 var bsAc db BusAcnts FirstOrDefault
  • linq where 子句和 count 导致 null 异常

    除非 p School SchoolName 结果为 null 否则下面的代码将起作用 在这种情况下 它会导致 NullReferenceException if ExistingUsers Where p gt p StudentID i
  • 使用 dateTimePicker 在 DataGridView 中编辑日期

    我有一个DateTime我的 WinForms 中的专栏DataGridView 目前只能通过手动输入日期来编辑该字段 例如 2010 09 02 需要什么才能拥有一个DateTimePicker 或同等 用作编辑器 DataGridVie
  • 在特定线程上运行工作

    我想要一个特定的线程 任务队列并在该单独的线程中处理任务 应用程序将根据用户的使用情况创建任务并将其排队到任务队列中 然后单独的线程处理任务 即使队列为空 保持线程活动并使用它来处理排队任务也至关重要 我尝试过几种实现TaskSchedul
  • 如果仅使用第一个元素,是否必须为整个结构分配内存?

    我有一个结构 其中第一个元素被测试 并且根据其值 结构的其余部分将被读取或不会被读取 在第一个元素的值指示结构的其余部分不会被读取的情况下 我是否必须为整个结构或仅第一个元素分配足够的内存 struct element int x int
  • 'iter' 的名称查找已更改为新的 ISO 'for' 范围

    我正在尝试编译下面的两个文件 但从编译器收到错误消息 gcc 4 3 3 Linux 错误位于带有以下符号的行 LINE WITH ERROR 我做错了什么 我该怎么改变 路易斯 g c b h b cpp b cpp In functio
  • 展开 std::reference_wrapper 的成本

    Given include
  • C - 获取外部IP地址

    我需要通过 C C 调用获取我的公共 IP 地址 我知道作为替代方案 我可以从 http whatismyip akamai com 等外部链接获取 我写了一个示例来获取外部IP地址 但我的程序没有返回外部 IP 地址 我正在获取内部 IP
  • 在 C# 中使用自定义千位分隔符

    在显示字符串时 我尝试不使用 字符作为千位分隔符 而是使用空格 我想我需要定义一种自定义文化 但我似乎做得不对 有什么指点吗 例如 将 1000000 显示为 1 000 000 而不是 1 000 000 no String Replac

随机推荐

  • ASP.NET 在当前上下文中不存在

    我面临一个问题 我使用了 dropdownList 控件 ID 是drpDownCountries在 ASP NET 项目中 dropdownlist控件放置在页面上 在C 的代码隐藏文件中 同时键入控件名称drpDownCountries
  • 将 XML 作为参数传递给 Web 服务

    In an answer https stackoverflow com questions 2597056 is there an xmlencode xmldecode for net 2597262 2597262对于另一个问题 有人
  • 生成器理解如何工作?

    生成器理解有什么作用 它是如何工作的 我找不到有关它的教程 你了解列表推导式吗 如果是这样 生成器表达式就像一个列表理解 但它不是查找您感兴趣的所有项目并将它们打包到列表中 而是等待 并从表达式中逐一生成每个项目 gt gt gt my l
  • 我如何选择这个跨度元素?

    我刚刚开始使用 Selenium 现在需要选择这个元素 span class close Matrices span 这行代码返回零个元素 所以我猜它不是正确的 ReadOnlyCollection
  • Criteria.DISTINCT_ROOT_ENTITY 不会阻止重复的对象

    我有以下 dao 方法 Override public List
  • 玩法:如何实现动作组合

    鉴于以下情况ActionBuilder实施 class SignedRequest A request Request A extends WrappedRequest A request object SignedAction exten
  • 创建具有通用返回类型的 FlinkSQL UDF

    我想定义函数MAX BY接受类型值T和类型的订购参数Number并根据排序从窗口返回最大元素 类型为T 我试过了 public class MaxBy
  • 在哪里可以找到所有谷歌地图 v3 事件列表?

    正如标题 我搜索了官方谷歌地图 API 参考和其他网站 我找不到完整可用事件的文档列表 请给我一个提示来获取所有 v3 事件 多谢 API参考 https developers google com maps documentation j
  • JavaScript 获取当前应用于元素的样式列表

    List only渲染的样式 而不是未应用的任意样式 我尝试了很多方法来将样式应用于元素 但结果都是空白 请不要引用getComputedStyle除非你能解决垃圾退货问题 否则这是一个解决方案 主要问题是window getCompute
  • 有没有办法让 gpg 签署所有以前的提交?

    正如标题所示 我正在寻找一种方法来 gpg 签署存储库中我以前的所有提交 最好不要为每次提交输入密码 我的方法是 git rebase exec git commit amend no edit n S i 8fd7b22 所有提交从下一个
  • python 课堂上有太多自我

    我正在学习 Python OOP 并尝试将 Java 类转换为 Python 类 请参阅此 PDF 中的第 15 页了解 Java 代码 google 文档link https docs google com open id 1eqzajO
  • Flutter 项目中任务“:app:processDebugResources”执行失败

    我从 7 月份开始重新开始 Flutter 项目的工作 并且遇到了大量的依赖问题 我正在慢慢解决这些问题 然而 这个我就是无法摆脱 Launching lib main dart on sdk gphone x86 in debug mod
  • imageView 中的圆角[重复]

    这个问题在这里已经有答案了 这是我的 xml 布局
  • set 中的哈希表在 python 中如何工作?

    据我所知 set在python中通过哈希表来实现O 1 查找复杂度 虽然它是哈希表 但其中的每个条目set必须是可散列的 或不可变的 所以这种和平的代码引发了异常 gt gt gt dict Traceback most recent ca
  • Google 标签管理器不会将事件推送到 Android 上的数据层

    我正在尝试在我的 Android 应用程序中实现标签管理器 如下本指南 https developers google com tag manager android v4 但由于某种原因我无法将事件推送到数据层 Override prot
  • hibernate中的实体和值类型

    对象级别的实体类型和值类型有什么区别 我知道实体将有一个 id 但值不会 但是为什么我们需要不同的方法来映射实体与值类型 这样做是为了让 hibernate 可以对值类型应用任何优化吗 实体已经定义了其持久保存的表 因此 当实体 A 中有
  • WooCommerce - 在哪里可以编辑由挂钩生成的 HTML?

    我是 WooCommerce 新手 无论如何 我想创建自己的主题 所以我遵循指南并将核心模板文件复制到 mywordpresstheme woocommerce 一切都很好 我正在编辑模板 效果很好 然而 WooCommerce 中的挂钩和
  • C++ 十六进制解析

    我想知道如何将十六进制字符串转换为人类可读的字符串 如果这有意义 这将是我第一次真正遇到十六进制值 所以我仍在学习它们以及如何管理它们 我有一个程序正在从包含原始数据包数据 十六进制 的文件中读取数据 我需要解析这些信息 以便人类可读 我需
  • 如何在Angular2中调用其他组件的方法

    在 addTo component ts 组件中 我有一个方法和构造函数 如下所示 Method addTo ServicePlanId basketSection Constructor constructor private route
  • 模板赋值运算符重载之谜

    我有一个简单的结构Wrapper 通过两个模板化赋值运算符重载来区分 template