为什么可变参数模板构造函数比复制构造函数更匹配?

2023-11-27

以下代码无法编译:

#include <iostream>
#include <utility>

struct Foo
{
    Foo() { std::cout << "Foo()" << std::endl; }
    Foo(int) { std::cout << "Foo(int)" << std::endl; }
};

template <typename T>
struct Bar
{
    Foo foo;

    Bar(const Bar&) { std::cout << "Bar(const Bar&)" << std::endl; }

    template <typename... Args>
    Bar(Args&&... args) : foo(std::forward<Args>(args)...)
    {
        std::cout << "Bar(Args&&... args)" << std::endl;
    }
};

int main()
{
    Bar<Foo> bar1{};
    Bar<Foo> bar2{bar1};
}

编译器错误向我表明编译器正在尝试使用可变参数模板构造函数而不是复制构造函数:

prog.cpp: In instantiation of 'Bar<T>::Bar(Args&& ...) [with Args = {Bar<Foo>&}; T = Foo]':
prog.cpp:27:20:   required from here
prog.cpp:18:55: error: no matching function for call to 'Foo::Foo(Bar<Foo>&)'
  Bar(Args&&... args) : foo(std::forward<Args>(args)...)

为什么编译器会这样做以及如何修复它?


这个电话:

Bar<Foo> bar2{bar1};

其过载集中有两个候选者:

Bar(const Bar&);
Bar(Bar&);       // Args... = {Bar&}

确定一种转换序列是否优于另一种转换序列的方法之一是来自 [over.ics.rank]:

标准转换序列 S1 是比标准转换序列更好的转换序列 S2 如果

— [...]
— S1和S2是引用绑定(8.5.3),引用引用的类型是相同的 顶级类型除外cv-限定符,以及 S2 初始化的引用所指的类型 更多的是cv-比 S1 初始化的引用所引用的类型限定。[ 例子:

int f(const int &);
int f(int &);
int g(const int &);
int g(int);

int i;
int j = f(i);    // calls f(int &)
int k = g(i);    // ambiguous

—结束示例]

转发引用可变参数构造函数是更好的匹配,因为它的引用绑定 (Bar&) 较小cv- 比复制构造函数的引用绑定限定(const Bar&).

就解决方案而言,您可以随时从候选集中排除Args...您应该使用 SFINAE 调用复制或移动构造函数:

template <typename... > struct typelist;

template <typename... Args,
          typename = std::enable_if_t<
              !std::is_same<typelist<Bar>,
                            typelist<std::decay_t<Args>...>>::value
          >>
Bar(Args&&... args)

If Args...是其中之一Bar, Bar&, Bar&&, const Bar&, then typelist<decay_t<Args>...>typelist<Bar>- 这是我们想要排除的情况。任何其他集合Args...会被允许就好了。

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

为什么可变参数模板构造函数比复制构造函数更匹配? 的相关文章

  • 如何向WebRequest添加参数?

    我需要从 Web 服务调用一个方法 所以我编写了以下代码 private string urlPath http xxx xxx xxx manager string request urlPath index php org get or
  • C++ 中的“int”默认是“signed long int”吗?

    Is int默认情况下signed long int in C 它是否依赖于平台和 或编译器 如果是这样 怎么办 EDIT 以下任何一项是否保证是重复的 signed short int signed int signed long int
  • C# - Visual Studio 中的 System.OutOfMemoryException

    我遇到问题 当我右键单击 Visual Studio 中的主窗体并转到 视图设计器 时 出现错误 它说 引发了 System OutOfMemoryException 类型的异常 堆栈跟踪 at System Reflection Asse
  • 静态 OpenCV 库中未定义的引用

    我有一个使用 OpenCV 3 1 的 C 项目 并且使用共享库可以正常工作 但现在我想使用静态库 位于项目目录中的文件夹中 来编译它 因为我希望能够在未安装 OpenCV 的情况下导出它 如果需要还可以编辑和重新编译 这次我重新编译了 O
  • ASMX Web 服务,测试表单仅在本地计算机上适用于一种 WebMethod

    我有一个正在测试的 ASMX WebService 并且在大多数方法上我都可以使用测试表单进行测试 然而 我确实有一种方法 测试表上写着 The test form is only available for requests from t
  • C语言中没有循环可以打印数组吗?

    例如 在Python中 如果我们将一个列表作为数组 它会直接用一行代码打印整个数组 有什么办法可以用C语言实现同样的事情吗 简短回答 No 对表格上几乎所有问题的简短回答 用 C 语言做 X 工作能像用 Python 一样简单吗 No 长答
  • AcceptSocket 超时?

    是否有可能AcceptSocket on a TcpListener具有超时的对象 以便它偶尔被中断 TcpListener server new TcpListener localIP port server Start while sh
  • 打开位置设置页面或提示用户启用位置

    我一直在绞尽脑汁 徒劳地谷歌搜索 我正在尝试找到一种方法来提示用户通过直接进入设置页面或仅点击屏幕上的 是 来切换位置 我见过的所有代码似乎都不起作用 有人有有效的方法吗 一个详细的例子将不胜感激 谢谢 我对 Xamarin 开发非常陌生
  • PartialView Action 正在调用自身

    我有 MVC 应用程序 它用于从主视图 ProductMaster 将 ProductAreaGrid 列表显示为 PartialView 并且它将在局部视图内将 CreateProductArea 作为 PartialView 我的 Gr
  • C#生成的csv文件通过电子邮件发送嵌入到Lotus Note中电子邮件的底部

    我遇到了一个奇怪的问题 即使用 NET SmtpClient 通过电子邮件发送的 CSV 附件出现在电子邮件底部 而不是 Lotus Note 中的附件 我只是不知道如何解决这个问题 而且我无法访问客户端计算机 这使得调试非常困难 我可以采
  • 根据 Active Directory 策略检查密码[重复]

    这个问题在这里已经有答案了 我有一个允许用户更改其 AD 密码的前端 有没有办法获取特定用户及其属性 长度 复杂性 的密码策略 例如细粒度 有没有办法根据此特定策略检查字符串 xyz121 编辑 我不想检查活动目录中存储的当前密码 我想检查
  • 使用 catch all 字典属性将 json 序列化为对象

    我想使用 JSON net 反序列化为对象 但将未映射的属性放入字典属性中 是否可以 例如给定 json one 1 two 2 three 3 和 C 类 public class Mapped public int One get se
  • 主构造函数不再在 VS2015 中编译

    直到今天 我可以使用主构造函数 例如 public class Test string text private string mText text 为了能够做到这一点 在以前的 Visual Studio CTP 中 我必须将其添加到 c
  • 原子的 C++ 内存屏障

    在这方面我是个新手 谁能提供以下内存屏障之间差异的简化解释 窗户MemoryBarrier 围栏 mm mfence 内联汇编asm volatile memory 内在的 ReadWriteBarrier 如果没有简单的解释 一些好文章或
  • 文件加密与解密问题

    我一直在尝试在 VC Express 2010 中加密和解密文件 我见过的所有教程和文档都需要两个FileStreams 来加密文件 一个用于读取未加密的版本 另一个用于加密 当我实际编写代码时 它不断抛出错误 告诉我它无法打开该文件 因为
  • 禁用实体框架的默认值生成(Code First)

    我数据库中有一个列不能为空 我想将其设置为默认值在数据库中 问题是实体框架似乎自己创建了一个默认值 例如 int gt 0 并且完全忽略了数据库中的默认值约束 有没有办法禁用实体框架的默认值 我发现您可以使用以下属性来装饰您的字段 Data
  • List 或其他类型上的 string.Join

    我想将整数数组或列表转换为逗号分隔的字符串 如下所示 string myFunction List
  • 删除数组时出现访问冲突异常

    删除分配的内存时 出现 访问冲突读取位置 异常 如下所示 我有一个针对 Visual Studio 2010 工具集 v100 C 编译器编译的本机 dll 我有一个针对它的托管 dll 包装器 它是针对工具集 v90 编译的 因为我想以
  • 如何使 WinForms UserControl 填充其容器的大小

    我正在尝试创建一个多布局主屏幕应用程序 我在顶部有一些按钮链接到应用程序的主要部分 例如模型中每个实体的管理窗口 单击这些按钮中的任何一个都会在面板中显示关联的用户控件 面板包含用户控件 而用户控件又包含用户界面 WinForms User
  • 检查另一种形式的线程是否仍在运行

    我有一个涉及两个窗体的 Windows 窗体应用程序 子表单用于将数据导出到 CSV 文件 并使用后台工作者写入文件 当这种情况发生时 我隐藏了表格 当后台工作程序运行时 父窗体仍然处于活动状态 因此即使后台工作程序正在写入文件 用户也可以

随机推荐

  • 输入大小固定的算法复杂度

    我找到了一些关于大 O 表示法的参考资料 但据我所知 算法复杂性是输入数据大小的函数 例如 如果冒泡排序的复杂度为O n 2 n是输入数组的大小 正确的 但是 如何确定具有固定输入大小并取决于输入值的算法的复杂性 例如 求最大公约数 GCD
  • bookdown:自定义输出文件名

    这是我之前在这里提出的问题的后续 为 bookdown 项目创建随附幻灯片 Bookdown允许将文件编译为各种格式 包括多个pdf 因此 问题是给输出赋予不同的名称 如果没有 则第二个pdf编译覆盖第一个 在对我之前问题的评论中 我写道
  • Wakanda 服务器脚本化干净关闭

    通过 OS X shell 脚本执行 Wakanda 服务器彻底关闭的最佳实践是什么 这将是当前加载和运行的解决方案 即将发布的 1 1 0 版本的最佳实践 处理applicationWillStop事件在service处理应用程序特定的关
  • .NET:如何在不打开文件的情况下打印文件

    我们有一个主要用于归档文件的应用程序 并且我们为用户提供了打印这些文件的可能性 它们可以是 txt doc pdf jpg 没什么花哨的 有没有一种 NET 方法可以将这些文件发送到打印机而不需要进一步处理它们 即打开它们 我已经尝试使用
  • 带 SFTP 的 Paramiko SSH 客户端

    如何进行 SFTP 传输SSHClient在远程服务器上 我有一个本地主机和两个远程主机 远程主机是备份服务器和Web服务器 我需要在备份服务器上找到必要的备份文件 并通过 SFTP 将其放在 Web 服务器上 如何使 Paramiko 的
  • 如何在 Flutter 中获取、设置、更新和删除 Cloud Firestore 中的数据?

    我尝试了一些代码 但出现异常 我得到的异常 java lang IllegalArgumentException Invalid document reference Document references must have an eve
  • 如何避免 HTML5 Canvas 中的多边形边缘缝合伪影?

    我为 OpenHeatMap 开源项目维护并行 Flash 和 HTML5 Canvas 渲染器 我受到两个版本之间带有分数坐标的填充多边形渲染不一致的困扰 如果渲染共享一条边的两个多边形 Canvas 将沿该边显示可见的连接 而 Flas
  • ViewExpiredException:找不到已保存的视图状态:在 JSF 中提交表单时

    我在尝试提交表单时遇到以下异常 javax faces application ViewExpiredException page1 xhtml No saved view state could be found for the view
  • 在Ubuntu上的QT5中将透明的QWidget放在QMediaView之上

    Goal 我希望基于 QT5 的 GUI 的背景是正在播放的视频文件 我还希望能够以透明度设置 GUI 组件的样式 以便视频能够透过它们显示 我不确定这是否有可能实现 可能是我刚刚错过了一个重要的线索 我毕竟是 Qt 初学者 也可能是它根本
  • Node.js读取USB端口信号

    我已经安装了串行端口使用 npm 的 Node js 模块 npm install serialport 现在我想通过计算机的 USB 端口从 Android 手机向节点应用程序发送一些消息 假设节点可以读取串行端口信号 以前有人这样做过吗
  • 如何在WinDbg中设置符号?

    我在用Windows 调试工具启动 WinDbg cdb 或 ntsd 时收到以下错误消息 Symbol search path is Invalid Symbol loading may be unreliable without a s
  • 使用 Google Apps 脚本获取工作表单元格注释值

    有没有办法获取单元格注释的值并将其显示在旁边的单元格中 我有一个 C 列 其中一些单元格包含注释 我想获取这些注释值并将每个单元格注释写入 D 列中其旁边的单元格中 例如 如果单元格 C4 有注释 无条目 我想在 D4 中显示 无条目 我今
  • PostgreSQL 转义 JSON 字符串

    我正在尝试使用 PostgreSQL 9 3 中的新 JSON 功能 并且正在寻找一个未转义 JSON 的函数 与 to json anyelement 相反 下面是一个 JSON 示例 single comment Fred said H
  • R 统计:简单列向量的问题

    我在使用从制表符分隔的数据文件导入的数据时遇到问题read delim 大多数列都包含我需要执行的数字数据t test为了 不幸的是我总是收到这个错误 Error in if stderr lt 10 Machine double eps
  • 通过readinto()将二进制数据解析为ctypes结构对象

    我正在尝试处理二进制格式 按照此处的示例 http dabeaz blogspot jp 2009 08 python binary io handling html gt gt gt from ctypes import gt gt gt
  • 在关闭警告中访问 foreach 变量

    我收到以下警告 访问闭包中的 foreach 变量 使用不同版本的编译器编译时可能有不同的行为 这就是我的编辑器中的样子 我知道如何解决此警告 但我想知道为什么会收到此警告 这是关于 CLR 版本吗 与 IL 有关吗 此警告有两个部分 第一
  • 在 Quartz.Net 中调度相关作业

    我需要一些帮助 我正在尝试弄清楚如何在 Quartz Net 中安排工作 Quartz 中的作业对应于我的 Web 应用程序中的任务 它们都是我的 Web 应用程序中作业的一部分 我希望用户能够按需启动作业 Web应用程序上下文 并使其立即
  • 为什么我在执行 sql 脚本时收到“不一致的结束行”警告窗口?

    当我尝试执行 sql 脚本时 它会出现一个警告窗口 以下文件中的行结尾不一致 是否要 使其正常化 我只是想知道为什么会出现此问题以及如何永久修复它 请帮忙 因为有些行以 CR LF 对结尾 有些行仅以 CR 或 LF 结尾 基本上以某种方式
  • 如何使 sqlalchemy 在反映表时返回 float 而不是 Decimal?

    我有一个在 Python 代码之外定义的 MySQL 数据库 我使用反射将其放入 SQLAlchemy 因此我没有任何可以修改的类定义 我不必担心失去精度 并且我对 Python 中的结果进行了一些算术运算 因此我宁愿不必手动将一堆值转换为
  • 为什么可变参数模板构造函数比复制构造函数更匹配?

    以下代码无法编译 include