模板函数匹配问题

发布于 2022-09-11 22:28:37 字数 658 浏览 37 评论 0

这是unique_ptr的部分源码经过修改后得到的。
有以下结构

clipboard.png

然后查看_Decltype的类型(这里的A和B都是定义了pointer成员的类)

clipboard.png

我的问题是,为什么这里_Decltype的类型是_Iden<B*>而不是_Iden<A::pointer>呢?换句话说,为什么在结构体_Get_deleter内部_decltype推导_Fn<_Ty>(0)的类型是用的第二个_Fn而不是第一个_Fn?这里的0为什么没有匹配int型参数的_Fn而是去匹配_Wrap型参数的_Fn呢?
而且我注意到_Wrap结构体的注释中提到:“wraps int so that int ...”似乎也是指int型参数会使用_Wrap而不是int?这是为什么呢?
此外,我还尝试过注释第二个_Fn,结果编译就报错了,
但是如果我单独写两个_Fn,不放在结构体中,然后执行_Fn<T>(0)调用的就是int参数的_Fn了。。。实在不知道为什么,恳请指教,谢谢!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

叹沉浮 2022-09-18 22:28:37

楼主,我这里测试的结果是符合预期结果的,即如果A类有类型pointer则会识别到第一个_Fn,否则会识别到第二个_Fn。你先确认你的测试以下条件是否满足:A类的pointer要是public的,不同的访问权限会导致不同的匹配结果。其次,关于_Wrap的存在,你理解错了它的作用,在这里它是为了避免两个模板函数生成的函数具有相同的名字和参数列表,这样的话会产生调用不明确的问题。
关于调用不明确:c++会将所有重载函数以及模板函数实例化生成的函数放在一起做一个集合,然后在集合中寻找最匹配的那一个。但这些函数中不能有名字和参数列表一模一样的,因为c++的函数不能通过返回值进行重载,这样的话就会产生调用不明确的问题。

另:楼主想要看标准库的源代码的话,需要了解一些模板元编程的知识,但模板元编程中没有进标准的黑魔法太多了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文