强制编译器选择以 const T& 作为参数的复制构造函数

2023-11-25

我正在编写一个类,其中有模板化构造函数和复制构造函数。每次我想使用非常量对象调用复制构造函数时,都会选择模板化构造函数。如何强制编译器选择复制构造函数?

这是 mcve:

#include <iostream>

struct foo
{
    foo()
    {
        std::cout << "def constructor is invoked\n";
    }

    foo(const foo& other)
    {
        std::cout << "copy constructor is invoked\n";
    }

    template <typename T>
    foo(T&& value)
    {
        std::cout << "templated constructor is invoked\n";
    }
};

int main()
{
    foo first;
    foo second(first);
}

删除一个函数不是我想要的。


添加另一个构造函数:

foo(foo& other) : foo( const_cast<const foo&>(other))  // for non-const lvalues
{
}

The first示例代码中的对象是非常量左值,因此编译器更喜欢foo(foo&) over foo(const &)。前者由模板提供(带有T=foo&),因此被选中。

该解决方案涉及提供一个(非模板)构造函数foo(foo&)然后通过将其转换为对 const 的引用,将构造委托给复制构造函数

Update,我刚刚意识到foo右值也将被模板获取。这里有很多选项,但我想最简单的就是添加一个委托foo(foo&&),与上面的类似

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

强制编译器选择以 const T& 作为参数的复制构造函数 的相关文章

随机推荐

  • 条形图/线图位于同一图上,但条形图前面的轴和线图不同

    我正在使用 pandas 来绘制一些数据 如果我绘制这个 import pandas as pd import matplotlib pyplot as plt df pd DataFrame a 100 200 150 175 b 430
  • Heroku 上的 Discord 机器人抛出错误:agent ??= new https.Agent

    这与我的第一个问题有关 我更新了所有代码 在我的bot js is require dotenv config let ver process env DISCORD BOT client once ready async gt if ve
  • java中输出json文档中叶子节点的所有路径列表

    例如 给定这个 json 文档 store book category reference author Nigel Rees title Sayings of the Century price 8 95 category fiction
  • 如何按 NAN 值分割 pandas 时间序列

    我有一个 pandas TimeSeries 如下所示 2007 02 06 15 00 00 0 780 2007 02 06 16 00 00 0 125 2007 02 06 17 00 00 0 875 2007 02 06 18
  • oracle 将 DD-MON-YY 转换为 DD/MM/YYYY

    我正在尝试将 varchar2 列的格式从 转换为日 月 年 to 日 月 年 例如 来自 2016 年 1 月 1 日 to 2016年1月1日 如果您可以询问或可能有帮助 MON 部分是英语 但我当前的 NLS 设置是土耳其语 所有年份
  • 无效操作:类型接口{}不支持索引

    我是 golang 新手 在读取嵌套 JSON 响应时遇到问题 var d interface json NewDecoder response Body Decode d test d data map string interface
  • R 中的循环效率低下

    早上好 我已经在 R 中进行了几个月的开发 我必须确保我的代码的执行时间不会太长 因为我分析大数据集 因此 我一直在尝试尽可能多地使用向量化函数 然而 我仍然想知道一些事情 R中代价高昂的不是循环本身吗 我的意思是 当您开始修改循环内的变量
  • 检查 9.30 到 4 ruby​​ 之间的时间

    我有一个错误地生成它的代码 我认为必须有更好的方法来检查时间 gt 9 30 am 和时间 def checkTime goodtime false if Time now hour gt 9 and Time now min gt 30
  • maven-surefire-report-plugin不生成surefire-report.html

    我无法获取maven surefire 报告插件生成Surefire report html当我跑步时 mvn clean deploy site mvn clean site mvn site mvn clean install site
  • 在 MySQL 的文本列中搜索字符串

    我有 mysql 表 其中有一列将 xml 存储为字符串 我需要找到 xml 列包含给定 6 个字符的字符串的所有元组 其他都不重要 我只需要知道这 6 个字符的字符串是否存在 因此 文本格式为 xml 可能并不重要 问题 如何在mysql
  • 在 Excel 单元格中创建超链接?

    是否可以在 Excel 单元格中创建仅使用单元格文本的一部分作为可点击链接的超链接 IE 下表模型是否代表可以在 Excel 2010 中轻松构建的内容 模拟http dl dropbox com u 14119404 misc Micro
  • SQL Server 将整数转换为二进制字符串

    我想知道 SQL 中是否有一种简单的方法可以将整数转换为其二进制表示形式 然后将其存储为 varchar 例如 5 将转换为 101 并存储为 varchar 实际上 使用普通的旧 SQL 非常简单 只需使用按位与即可 我有点惊讶的是 网上
  • 如何管理子模块的版本?

    如果 Go 存储库有go mod文件位于其根目录中 也位于子文件夹中 子模块的版本是如何发布的 举例来说 我的团队一直在使用 Vault 来开发我们的内部 cli 工具 我们最终使用了 github com hashicorp vault
  • Apache 2.4.1 未定义对“SSLv2_client_method”的引用

    我之前运行的是 apache 2 2 20 和 openssl 1 0 0e 我安装了 openssl 1 0 1 然后下载了 apache 2 4 1 的 tarball 并安装了 apr 1 4 6 和 apr util 1 4 1 p
  • Play 2.0 中如何将多个参数传递到模板中?

    我想同时向我的模板渲染两件事 如下所示 String one one String two two return ok template render one two 但 Playframework 说这是错误的 那么如何才能同时渲染 2
  • 使 Cocoa 应用程序可编写脚本 Swift

    Goal 我正在尝试使我的 Cocoa 应用程序能够从 Applescript 中用 Swift 编写脚本 我做了什么 我创建了一个 SDEF 文件 配置了 info plist 并创建了一个我认为合适的类 定义 sdef
  • Grails Eclipse 插件

    我在 SO 上看到过各种批评 Eclipse Grails 插件的帖子 我想知道是否有人找到了一种在 Eclipse 中高效使用 Grails 的方法 我看了一下Grails 插件页面 并且那里的信息看起来不太有希望 特别是有关 禁用 Gr
  • Facebook 分享按钮和自定义文本[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 有没有办法让 Facebook 分享按钮在墙上或新闻提要上发布自定义文本 我们使用这样的东西 在一行中使用 a title send to Facebook href http
  • 简单的 Java HTTPS 服务器

    我需要为 Java 应用程序设置一个真正轻量级的 HTTPS 服务器 它是我们的开发实验室中使用的一个模拟器 用于模拟一台设备在野外接受的 HTTPS 连接 因为它纯粹是一个轻量级开发工具 根本不以任何方式用于生产 所以我很高兴能够绕过认证
  • 强制编译器选择以 const T& 作为参数的复制构造函数

    我正在编写一个类 其中有模板化构造函数和复制构造函数 每次我想使用非常量对象调用复制构造函数时 都会选择模板化构造函数 如何强制编译器选择复制构造函数 这是 mcve include