当参数是函数参数包时,在部分排序期间推导模板实参

2023-11-29

N4527 14.8.2.4 [温度扣除部分]

3 用于确定排序的类型取决于完成部分排序的上下文:

(3.1) — 在函数调用的上下文中,使用的类型是函数调用具有参数的函数参数类型。

(3.2) — 在调用转换函数的上下文中,使用转换函数模板的返回类型。

(3.3) — 在其他上下文 (14.5.6.2) 中,使用函数模板的函数类型。

4 上面从参数模板中指定的每个类型以及来自参数的相应类型 模板被用作类型P and A.

8 If A由函数参数包转换而成P不是参数包,类型推导失败。 否则,使用结果类型P and A,然后按照 14.8.2.5 中的描述进行扣除。如果P是一个函数参数包,类型A参数模板的每个剩余参数类型是 与类型相比P函数参数包的声明符 ID。每次比较都推导出 由函数扩展的模板参数包中后续位置的模板实参 参数包。如果给定类型推导成功,则考虑参数模板中的类型 至少与参数模板中的类型一样专业。 [ 例子:

template<class... Args>           void f(Args... args);        // #1
template<class T1, class... Args> void f(T1 a1, Args... args); // #2
template<class T1, class T2>      void f(T1 a1, T2 a2);        // #3

f();        // calls #1
f(1, 2, 3); // calls #2
f(1, 2);    // calls #3; non-variadic template #3 is more
            // specialized than the variadic templates #1 and #2

Why f(1, 2, 3);调用#2?

我需要更多详细信息,包括:

1 这是哪个上下文?

2 变形后的形态有哪些?
例如#1 的变换是void (U) , void (U...)或者其他形式?(U表示独特的类型)

14.5.6.2 [临时函数顺序]/p3

为每个类型、非类型或模板模板参数(包括 模板参数包(其中的14.5.3))分别合成唯一的类型、值或类模板 并将其替换为模板函数类型中该参数的每次出现。

3 有哪些类型P and A用于推导?例如

template <class T> void f(T);
int a = 1;
f(a);//P = T, A = int

Why f(1, 2, 3);调用#2?

您的问题中有很多问题(请每个问题一个问题!),所以我会坚持这一个问题。首先,我们进行模板推导。 #3 失败,但 #1 和 #2 成功:

template<class... Args>
void f(Args... args);        // #1, with Args = {int, int, int}
template<class T1, class... Args> 
void f(T1 a1, Args... args); // #2, with T1 = int, Args = {int, int}

这两个函数都需要三个ints 按值,因此重载决策中的所有正常决胜局都无法解决歧义。所以我们到了最后一个:

Given these definitions, a viable function F1 is defined to be a better function than another viable function F2 if for all arguments i, ICSi(F1) is not a worse conversion sequence than ICSi(F2), and then
— [...]
F1 and F2 are function template specializations, and the function template for F1 is more specialized than the template for F2 according to the partial ordering rules described in 14.5.6.2.

规则是:

Step 1:合成类型[temp.func.order]:

为每个类型、非类型或模板模板参数(包括 模板参数包(其中的14.5.3))分别合成唯一的类型、值或类模板 并将其替换为模板函数类型中该参数的每次出现。

所以我们有:

void f(Pack1... args);         // #1
void f(U2 a1, Pack2... args);  // #2

Step 2:按照[temp.deduct.partial]中的描述执行扣除。我们所处的上下文是函数调用,因此我们使用函数调用具有参数的类型。

首先,我们尝试从#1 推导出#2。也就是说,我们尝试匹配 (T1, Args...) 反对(Pack1...)。第一部分是P = T1, A = Pack1...。我们有:

如果 A 是从函数参数包转换而来并且 P 不是参数包,则类型推导失败。

所以从 #1 推导出 #2 失败,所以论证Args...至少不像T1, Args....

接下来,我们尝试从#2 中推导出#1。也就是说,我们尝试匹配(Args...)反对(U2, Pack2...)。这样就成功了,所以T1, Args...至少与Args....

由于#2 至少与#1 一样专业,而#1 至少不如#2 专业,因此我们可以说#2 更专业:

功能模板F至少与函数模板一样专业G如果,对于每对类型用于 确定排序、类型F至少与来自的类型一样专业G. F更专业 比G if F至少与G and G至少不像F.

更专业的模板是首选,所以我们称之为#2。

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

当参数是函数参数包时,在部分排序期间推导模板实参 的相关文章

  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 重载<<的返回值

    include
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐

  • 在 Firefox 中禁用跨域 Web 安全

    在 Firefox 中 我该如何做相当于 disable web security在 Chrome 中 这个问题已经被发布了很多次 但从来没有一个真正的答案 大多数是附加组件的链接 其中一些在最新的 Firefox 中不起作用或根本不起作用
  • 如何在 Julia 中使用 JuMP 提取优化问题矩阵 A,b,c

    我使用符号变量和约束在 Julia JuMP 中创建了一个优化模型 例如以下 using JuMP using CPLEX model Mod Model CPLEX Optimizer sets I 1 2 Variables x var
  • Perl 中的读写锁

    我正在寻找一种在 Perl 中实现读 写锁的好方法 这是同步 Windows 和 Unix 上不同 Perl 线程和 或进程的文件访问所必需的 尝试过 Fcntl flock 如果它按预期工作 这对我来说将是完美的 不幸的是 看起来在压力下
  • 是否可以使用 appengine 模块和云端点?

    使用 appengine 模块意味着创建动态 Web 应用程序 而不是通常的 appengine Web 应用程序项目 云端点与常见的 appengine Web 应用程序项目配合良好 但这些项目不支持 appengine 模块 问题是 如
  • 从 XML 生成 SQL 架构

    我们正在使用 Oracle 11 数据库和 java 开发环境 使用 Eclipse 并且希望将多个 xml 模式迁移到 SQL 模式 看过 ax xsd 但确实需要一些我们可以从 ant 运行的东西 未安装 SQL Server 的 Ec
  • Web Api 2 - 自定义数据类型JSON序列化

    我实际上是 Web Api 的新手 所以我的问题可能听起来有点奇怪 我有简单的 API 来返回有关价格变化的历史信息 我的控制器的操作如下所示 HttpGet Route api history id size public async T
  • 检索 SharePoint 列表数据并将其绑定到下拉列表

    我对 SharePoint 相当陌生 因此提前为听起来像 新手 而道歉 我创建了一个简单的 Web 部件 它使用 Web 用户控件 ascxfile 提供 Web 部件的所有控件 在 ascx 文件上 有一个 DropDownList 目前
  • SDN 4 - InProcessServer 在快照构建中损坏

    从大约一周前开始 运行测试进程内服务器 on 4 0 0 构建快照导致以下异常 Caused by java lang NoClassDefFoundError org neo4j ogm testutil TestServer at or
  • INSERT INTO 语句中的语法错误

    当我连接 Access 数据库时遇到问题 然后我在 INSERT INTO 语句中收到错误语法错误 我的代码是 string str Provider Microsoft ACE OLEDB 12 0 Data Source C Users
  • pandas 和 Stata 13 个文件

    我安装了 pandas 0 13 1 但是pandas read stata 无法阅读 dta以 Stata 13 格式创建的文件 出现错误 TypeError cannot concatenate str and NoneType obj
  • 如何将 stdin 上的输入发送到 Makefile 中定义的 python 脚本?

    鉴于这个问题的答案 在 Makefile 中嵌入 Python 以设置 make 变量这有效 define NEWLINE endef define PYTHON SCRIPT CODE import sys print hi endef
  • 通过分号分隔从单个查询中删除多个表

    我正在尝试从 sqlite 的单个操作中删除多个表 我尝试用分号分隔它 但它没有按预期工作 这是我当前的代码 NSString query DELETE from Friends DELETE from Stream DELETE from
  • PHP 获取活动会话

    我试图回显过去 15 分钟内处于活动状态的每个活动会话 我使用以下代码进行检查以记录其上次查看时间 SESSION last seen date Y m d H i s 但是在执行以下代码 即本文上方的代码 时 我收到这些错误 注意 未定义
  • R CMD 安装错误:test_load_package() 函数中出现意外符号

    Issue 我只是想从源代码构建一些包 但遇到了错误 错误 tools test load package rbenchmark per homedrive1 corp something org homedrive Tommy O Del
  • 选择范围中的单元格,直到行为空

    我有一个电子表格 始终从 A 列到 I 列 但行数的范围可能会有所不同 我想选择范围 A1 I20000 中的所有单元格 直到 A 列中的第一个空白单元格 因此如果数据以 202 结尾 它将停止选择第 202 行处的行 我尝试编写自己的公式
  • 更改 Div 样式 onclick

    我在页面顶部有 2 个选项卡 单击一个选项卡时 我希望该选项卡具有 活动 类 而另一个选项卡具有 非活动 类 以便用户可以看到当前选择的选项卡 我怎样才能用 javascript css 来做到这一点 div class tabActive
  • 如何在word中创建报告生成器

    我目前正在尝试制作它 以便我可以加载Word模板并提示填写数据 然后将这些数据填充到Word文档中 该报告有两个主要部分 概览中的第一个 系统将自动计算摘要 第二部分是摘要 其中将附加数据 在 Word 中生成报告的方法有多种 每种方法都有
  • WebBrowser 控件 - 控制台应用程序 - 事件未触发

    我一直在浏览各种WebBrowser控制stackoverflow问题 而且我似乎无法找到我遇到的问题的答案 我正在尝试使用用于打印网页的 WebBrowser 控件 下列的MSDN 的例子 我创建了以下控制台应用程序 namespace
  • 来自 Google 电子表格的电子邮件中的图表图像与 google-apps-script 返回白色图像

    我每天晚上都会向我自己的 Gmail 地址发送一份报告 大约一周后 图表的图像突然变成了空白 只有一张图表 function sendReport var ss SpreadsheetApp getActiveSpreadsheet var
  • 当参数是函数参数包时,在部分排序期间推导模板实参

    N4527 14 8 2 4 温度扣除部分 3 用于确定排序的类型取决于完成部分排序的上下文 3 1 在函数调用的上下文中 使用的类型是函数调用具有参数的函数参数类型 3 2 在调用转换函数的上下文中 使用转换函数模板的返回类型 3 3 在