参数的值类别在重载解析(或更一般的函数调用处理)的哪一部分中发挥作用?

2024-05-04

C++ 模板 - 完整指南 http://www.tmplbook.com/,在§C.1中,读取

  • 执行重载解析以找到best候选人。如果有则选择;否则,调用是不明确的。

然后,在§C.2中,对可能的匹配(给定参数与可行候选的相应参数)进行排序,如下所示(我的emphasis):

  • 完美搭配。参数具有表达式的类型,或者它的类型是对表达式类型的引用 (可能添加const and/or volatile预选赛)。
  • 进行细微调整的匹配。例如,这包括将数组变量衰减为指向其第一个元素的指针或添加const匹配类型的参数int**到一个类型的参数int const* const*.
  • 与促销相匹配。 ……
  • 仅与标准转换匹配。 ……
  • 与用户定义的转换匹配。 ……
  • 与省略号匹配 (...). …

现在,从最高层开始const按值参数不是函数签名的一部分,我认为第一点括号中的部分指的是参数是对表达式类型的引用的情况。如果我的解释是正确的,那就意味着T const&参数与类型参数完美匹配T.

毕竟,在 §C.2.2 中,我看到这一点得到了证实:

对于类型的参数X,构成完美匹配的常见参数类型有四种:X, X&, X const&, and X&& (X const&&也是完全匹配,...)

然后,本书继续提供一些示例,展示参数的类别值如何确定选择什么重载。

但如果所有的X, X&, X const&, X&&, and X const&&是完美匹配,那么什么时候根据参数的值类别首选其中之一?

这不是重载解析的一部分吗?如果是这样,为什么上述几点中根本没有提到价值类别?


为什么上面几点中根本没有提到价值类别?

书中提到了这一点,如下所示。特别是,如果您继续阅读下去,您会发现C.2.2节 titled 完善完美搭配确实提到了区分不同完美匹配的部分:

随着 C++11 中添加右值引用,需要区分两个完全匹配的另一种常见情况下面的例子说明了这一点:

struct Value {
...
};
void pass(Value const&); // #1
void pass(Value&&);// #2
void g(X&& x)
{
    pass(x); // calls #1 , because x is an lvalue
    pass(X()); // calls #2 , because X() is an rvalue (in fact, prvalue)
    pass(std::move(x)); // calls #2 , because std::move(x) is an rvalue (in fact, xvalue)
}

这次,采用右值引用的版本被认为与 RVALUES 更好匹配,但它不能匹配左值。

请注意上面引用的示例中的粗体部分。


同样,它甚至还有以下示例:

void report(int&); // #1
void report(int const&); // #2
int main()
{
    for (int k = 0; k<10; ++k) {
       report(k); // calls #1
    }
    report(42); // calls #2
}

这里,LVALUES 首选不带额外 const 的版本,而只有带有 const 的版本才能匹配 RVALUES。

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

参数的值类别在重载解析(或更一般的函数调用处理)的哪一部分中发挥作用? 的相关文章

  • 将复选框添加到 UniformGrid

    我正在尝试将复选框动态添加到 wpf 中的统一网格中 但看起来网格没有为它们分配足够的空间 所以它们都有点互相重叠 这就是我将它们添加到后面的代码中的方法 foreach string folder in subfolders PathCh
  • 如何检查图像对象与资源中的图像对象是否相同?

    所以我试图创建一个简单的程序 只需在单击图片框中更改图片即可 我目前只使用两张图片 所以我的图片框单击事件函数的代码 看起来像这样 private void pictureBox1 Click object sender EventArgs
  • C# 和 Javascript SHA256 哈希的代码示例

    我有一个在服务器端运行的 C 算法 它对 Base64 编码的字符串进行哈希处理 byte salt Convert FromBase64String serverSalt Step 1 SHA256Managed sha256 new S
  • 当我使用“control-c”关闭发送对等方的套接字时,为什么接收对等方的套接字不断接收“”

    我是套接字编程的新手 我知道使用 control c 关闭套接字是一个坏习惯 但是为什么在我使用 control c 关闭发送进程后 接收方上的套接字不断接收 在 control c 退出进程后 发送方的套接字不应该关闭吗 谢谢 我知道使用
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 在 Visual Studio 2008 上设置预调试事件

    我想在 Visual Studio 中开始调试程序之前运行一个任务 我每次调试程序时都需要运行此任务 因此构建后事件还不够好 我查看了设置的 调试 选项卡 但没有这样的选项 有什么办法可以做到这一点吗 你唯一可以尝试的 IMO 就是尝试Co
  • C#:如何防止主窗体过早显示

    在我的 main 方法中 我像往常一样启动主窗体 Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • clang 实例化后静态成员初始化

    这样的代码可以用 GCC 编译 但 clang 3 5 失败 include
  • WCF:将随机数添加到 UsernameToken

    我正在尝试连接到用 Java 编写的 Web 服务 但有些东西我无法弄清楚 使用 WCF 和 customBinding 几乎一切似乎都很好 除了 SOAP 消息的一部分 因为它缺少 Nonce 和 Created 部分节点 显然我错过了一
  • Validation.ErrorTemplate 的 Wpf 动态资源查找

    在我的 App xaml 中 我定义了一个资源Validation ErrorTemplate 这取决于动态BorderBrush资源 我打算定义独特的BorderBrush在我拥有的每个窗口以及窗口内的不同块内
  • 如何使用 std::string 将所有出现的一个字符替换为两个字符?

    有没有一种简单的方法来替换所有出现的 in a std string with 转义 a 中的所有斜杠std string 完成此操作的最简单方法可能是boost字符串算法库 http www boost org doc libs 1 46
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我

随机推荐

  • 如何在 C 中将文本文件作为命令行参数

    基本上 我试图接受命令行文本文件 以便当我以 program instructions txt 运行程序时 它会存储指令中列出的值 但是 我在测试当前拥有的内容时遇到了麻烦 因为它给了我错误 分段错误核心已转储 int main int a
  • python virtualenv和flask安装。没有名为flask的模块

    运行基本程序时我不断收到此错误 ImportError No module named flask 这是基本的程序 from flask import Flask app Flask name app route def hello wor
  • Android 中的 FLAG_ACTIVITY_CLEAR_TOP

    有人可以用一种非常简单的方式向我解释一下什么是FLAG ACTIVITY CLEAR TOP意思是 我知道有很多关于它的问题 但没有一个答案令我满意 有人还可以举一个这个标志有用的例子吗 谢谢 请检查以下链接以获取相同的详细信息 http
  • 无法在 Android Studio 中向 Activity_main.xml 添加任何项目

    在 Android Studio 中 我无法在设计视图中将调色板中的任何项目添加到 Activity main xml 中 它只是不允许我拖放它们 知道为什么会发生这种情况吗 这是打印屏幕 根据android studio中用于androi
  • 在运行时替换 Property Setter 方法

    我有许多共享一个公共基类的对象 我希望拦截所有设置属性值的调用 并记录这些值是否已在每个实例的基础上设置 我可以用反射替换运行时属性的 Set 方法吗 一种方法是使属性成为虚拟的 并在运行时通过反射发射创建一个子类来覆盖属性 添加您的代码
  • python-daemon 不记录标准输出重定向

    我在代码中使用 python daemon 其中包含 print 语句 我想将它们发送到一个文件 所以我运行了以下命令 python server py gt gt log out 然而什么也进不去log out 谁能告诉我我需要做什么 T
  • 在php中声明一个对象数组

    如何将 php 中的对象列表声明为私有实例变量 在 Java 中 声明看起来像这样private ArrayList ls构造函数会有这个ls new ArrayList Thanks PHP 动态分配内存 而且它并不关心您在数组中存储什么
  • 在 CSS 规则中重复类名是否会增加其优先级?

    假设我有一个 div li class menu item li 有人可以告诉我是否可以使用li menu item menu item menu item 使这个CSS规则具有更高的优先级 Update 下面是说明这一点的代码 ul li
  • 在 Windows 上使用堆栈安装 SDL2 for Haskell

    我正在尝试将 SDL2 与堆栈一起使用 我跟着这些说明 https www reddit com r haskellgamedev comments 4jpthu windows sdl2 is now almost painless vi
  • 使用 JavaScript 进行 CAPTCHA 验证

    我正在尝试使用 JavaScript 验证验证码 但我找不到任何有关验证码客户端 API 的资源 你有任何文件吗 If you could通过 JavaScript 验证验证码 这意味着在您传递给客户端的代码中可以轻松找到有效代码的方法 这
  • jQuery 对表列重新排序

    我找到了适用于行的各种解决方案 以及适用于普通表列的各种解决方案 但我需要一个允许我拖放 colspan gt 1 的列标题的解决方案 例如 table thead tr th A1 th th A2 th th A4 th th A5 t
  • 事件源和 SQL Server 多个关系表

    我们使用 SQL Server 2016 的事件源 我们有完整的客户产品应用程序 每个应用程序都标记为CustomerId并在事件商店中获取单个指南行项目 这是写入事件存储指南的主要标识符 产品应用程序附带许多不同的关系事物 没有引导 但有
  • SpriteKit:如何使用混合模式在图层中打孔

    我有一个简单的场景 添加了一些元素 现在我想专注于一个带有遮罩的特定元素 在与我想要关注的元素相同的位置切割整个元素 与我们在某些游戏第一次启动时看到的显示某种教程非常相似 基本上我添加了一个全屏层alpha 0 7 因此用户仍然可以看到所
  • ViewPager 中显示多个页面,位置不正确

    我正在尝试实现 Dave Smith 的 PagerContainer 以在我的 ViewPager 中显示多个页面 我已经实现了一个点击监听器来显示页码 但是当我单击左侧页面时 会显示 单击项目 2 消息 项目 0 是正确的 如果我单击中
  • VS Code 中运行代码和不调试运行的区别

    我是 cpp 编程的新手 使用 Visual Studio 代码 我不明白 Ctrl Alt N 运行代码 和 Ctrl F5 运行而不调试 之间有什么区别 Ctrl Alt N Run Code is a shortcut provide
  • 如果我有一些其他编程经验,学习 C++ 的最佳方法是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 只是想知道您对我学习 C 的策略有何看法 虽然我知道掌握一门编程语言需要数年时间 但我只是想尽快达到可以被认为有能力的水平 为什么要快 好吧 当
  • MSBuild:OutputPath 目录为空

    我想部署我的 ASP NET MVC 站点并具有以下脚本
  • Razor 三元表达式中的 Html 文字

    我正在尝试做类似以下的事情 div string IsNullOrEmpty myString nbsp myString div 上面的语法无效 我尝试了很多不同的东西但无法让它工作 请尝试以下操作 Html Raw string IsN
  • Windows 铿锵声Hello World lnk4217

    我已经安装了 clang 版本 6 0 以及 Visual Studio 2017 我正在编译一个简单的 hello world 应用程序 include
  • 参数的值类别在重载解析(或更一般的函数调用处理)的哪一部分中发挥作用?

    C 模板 完整指南 http www tmplbook com 在 C 1中 读取 执行重载解析以找到best候选人 如果有则选择 否则 调用是不明确的 然后 在 C 2中 对可能的匹配 给定参数与可行候选的相应参数 进行排序 如下所示 我