C++ Primer(第 5 版):“16.3 重载和模板”的所有“更专业”示例都是错误的吗?

2023-12-05

C++ Primer(第 5 版)第 16.3 节 - 重载和模板 - 教授在存在候选函数模板实例化的情况下的函数匹配过程。

以下是本节中使用的函数模板的声明:

using std::string;
template <class T> string debug_rep(const T &); /* 1 */
template <class T> string debug_rep(T *);       /* 2 */
// definitions not relevant for the questions

第一个例子

string s("SO");
debug_rep(&s);

据说生成的实例将是:

  1. debug_rep(const string *&) (with T势必string *)
  2. debug_rep(string *)

Q1#1 正确吗?它不应该实例化吗debug_rep(string* const &)反而?

第二个例子

const string *sp = &s;
debug_rep(sp); //string literal type is const char[10]

据说生成的实例将是:

  1. debug_rep(const string *&) (with T势必const string *)
  2. debug_rep(const string *)

因此,两个实例化的候选者将提供精确的匹配,在更专业的模板上进行选择(->#2)

Q2.1#1 正确吗?它不应该实例化吗debug_rep(const string* const &)?

Q2.2假设实例化的函数是上面的函数,我们是否可以断言它不再是完全匹配的?

第三个例子

debug_rep("SO world!"); //string literal type is const char[10]

据说生成的实例将是:

  1. debug_rep(const T &) (with T势必char[10])
  2. debug_rep(const string *)

因此,两个实例化的候选者将提供精确的匹配,在更专业的模板上进行选择(->#2)

Q3.1推导出的类型是T#1 正确吗?不应该是吗const char[10]反而 ?

Q3.2假设推导出的类型为T实际上就是上面那个,我们可以断言它不再是完全匹配的吗?


您将获得以下声明:

using std::string;
template <class T> string debug_rep(const T &); /* 1 */
template <class T> string debug_rep(T *);       /* 2 */

在调用中

string s("SO");
debug_rep(&s);

the &s产生一个string*,只能匹配T const&(1) 当T is string*。为了T*在 (2) 中,有一个匹配T势必string。所以,只要你的引用是正确的,这本书就是错误的

debug_rep(const string *&)

是一个可能的实例化:不存在这样的实例化。

实例化的结果是T = string*相反会是

debug_rep( string* const& )

但是哪个实例化会被调用呢?

作为一般规则,最简单的匹配是更好的,但我从来没有记住确切的规则,所以,我问 Visual C++(因为它typeid(T).name()默认情况下生成可读的类型名称):

#include <iostream>
#include <string>
#include <typeinfo>
using namespace std;

template< class T >
struct Type {};

template <class T> auto debug_rep( T const& )   // 1
    -> string
{ return string() + "1 --> T = " + typeid(Type<T>).name(); }

template <class T> auto debug_rep( T* )         // 2
    -> string
{ return string() + "2 --> T = " + typeid(Type<T>).name(); }

auto main() -> int
{
    string s( "SO" );
    cout << debug_rep( &s ) << endl;
    cout << "The type 'int const' is shown as " << typeid(Type<int const>).name() << endl;
}

它说:



2 --> T = struct Type<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >
The type 'int const' is shown as struct Type<int const >
  

对于你的第二个和第三个例子,依此类推:显然作者有些混淆const.

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

C++ Primer(第 5 版):“16.3 重载和模板”的所有“更专业”示例都是错误的吗? 的相关文章

随机推荐

  • 如何隐藏或折叠 VSC 中的所有 javascript console.log 行

    大量的日志记录对我来说非常有帮助 然而 有时我想通过隐藏 折叠或降低字体的不透明度来暂时减少在 VSC 中编辑的代码的混乱程度 console log console warn and console errorjavascript Vue
  • PHP 重定向强制刷新 (CTRL+F5)

    我有一个带有可编辑表格的页面 我需要用户能够编辑它 然后提交他们的更改 一切正常 直到我将它们重定向到包含新内容 与其更改相关 的同一页面 然而 他们看到的是旧内容 如果我在浏览器上按 ctrl f5 它们的内容就会更新 我想知道是否有办法
  • C# 语法:----- IEnumerable people = new List();

    我理解前两句话 然而 对于第三个说法 我无法弄清楚这是什么类型的人 IEnumerable 人 还是列表 人 我认为幕后有一个转换 有人能解释一下陈述3中使用了什么技术吗 IEnumerable Person people new IEnu
  • 谷歌玩游戏成就重置(每天)

    上周我们软启动了我们的游戏 我们开始收到人们的错误 他们 所有人 似乎都存在的错误之一是 他们的成就至少每天都会被重置 但有时甚至在重新启动游戏时也会重置 成就在解锁时确实会弹出窗口 甚至在成就 UI 中可见 但它们不断被重置 删除 我们确
  • 从 Plone 内容类型生成 PDF

    我需要从内容类型创建 PDF 如果重要的话 可以灵活地制作 以便用户创建一个新文档 并在填写表单后生成 PDF 并准备下载 因此 基本上在创建 修改文档后 应该创建一个 PDF 并将其存储在 ZODB 中 实际上我使用的是 blob 以便我
  • 忽略 内的元素以不在点击时导航

    我正在尝试开始删除 btn 它位于 div 内 该 div 包含在react router dom 标记中 我希望能够在单击该 div 时导航到已建立的路径 但如果目标是删除 btn 那么它不应该导航 而只是在删除 btn 内执行 onCl
  • 如何在 Vim(或其他地方)中使用正则表达式搜索十六进制转储?

    我正在寻找一种方法来搜索二进制文件的十六进制转储中一系列十六进制数字的文本表示形式 如下所示 0x000001A0 36 5B 09 76 99 31 55 09 78 99 34 51 49 BF E0 03 0x000001B0 28
  • 绘制多重比较图?

    当一个人希望比较 测试 多个组时 例如 在进行方差分析时 就会面临多重比较的问题 如果我们想绘制比较图 同样适用 我的问题是 您知道哪些工具 在 R 中 可以进行反映多重比较的绘图 目前 我只知道两个 尽管我确信还有更多 TukeyHSD
  • 在 C 中将 char 指针类型转换为 float [重复]

    这个问题在这里已经有答案了 我有一个包含 ff 数据的平面文件 date quantity price item 我想使用以下结构创建数据记录 typedef struct char date item int quantity float
  • 使用 Python 的旧推文 Tweepy

    我正在尝试使用 Python 中的 tweepy 获取较旧的推文数据 大约 2 个月前 我尝试了自始至终的参数 但没有成功 有没有人在 tweepy 或其他 API 中找到解决办法 for id tweet in enumerate twe
  • 如何将布尔值插入数据库

    我必须将用户数据添加到名为 employees 的数据库表中 它有 ID 姓名 姓氏 用户名 密码 电子邮件 地址 管理员权限选项 Administator rigts 是布尔选项 是或否 当我制作一个包含所有数据的表单时 我想通过复选框检
  • 为什么Python无法从PIL导入图像?

    我尝试运行的单行如下 from PIL import Image 无论这看起来多么简单 它都会给出一个错误 Traceback most recent call last File C 2014 10 22 12 49 py line 1
  • 在 SQL Server 中创建审核触发器

    我需要对 SQL Server 2005 数据库中的两个表实施更改跟踪 我需要审核添加 删除 更新 详细说明更新内容 我本来打算使用trigger这样做 但似乎很容易错误地做到这一点 任何人都可以发布一个更新触发器的示例 以优雅的方式成功地
  • C# 如何将两个表达式组合成一个新表达式?

    我有两种表达方式 public static Expression
  • requiredFieldValidator - 因此,如果禁用 Javascript,则可以避免整个 .NET 控件?

    我最近正在使用 NET 并且检查了一些字段 我知道检查是在客户端 javascript 和服务器端进行的 Page Validate if Page IsValid 但如果禁用了 javascript 则所有这些都不会被检查 事实上 当我尝
  • ios 8自定义键盘按住按钮可以删除吗?

    我目前正在构建一个自定义键盘 我快完成了 我遇到的一个问题是删除按钮 当用户点击删除按钮时 它会执行它应该执行的操作并删除先前的文本条目 然而 当用户按住按钮时 什么也没有发生 如何让用户按住删除按钮时 键盘像标准ios键盘一样连续删除 这
  • 为什么延迟求值可以将不纯函数转化为纯函数?

    我知道纯函数是不依赖于系统状态的函数 没有副作用 其输出仅取决于其输入 进行 http 调用被认为是副作用 因此 以下是不纯函数的示例 const httpCall url params gt getJson url params 但是 只
  • pyqtgraph:对齐不同图中x轴的刻度

    这是后续这个问题 问题是当其中一个图重新缩放时如何调整多个 pyqtgraph 的 x 轴缩放 我想要的结果是所有图表的刻度完美对齐 以便您可以直接比较两个图表的内容 给定的答案存档了该任务 即根据变化重新缩放图表 但是当图表的内容不同时
  • 乔达时间:最近一周和一个月

    获取给定日期的最近完整一周和最近完整月份的开始 结束日期的最佳方法是什么 即给定今天的日期 如何找出刚刚完成的一周 一个月也是如此 我得到了解决方案 LocalDate today new LocalDate LocalDate lastW
  • C++ Primer(第 5 版):“16.3 重载和模板”的所有“更专业”示例都是错误的吗?

    C Primer 第 5 版 第 16 3 节 重载和模板 教授在存在候选函数模板实例化的情况下的函数匹配过程 以下是本节中使用的函数模板的声明 using std string template