在一个面试中,猛然间一闪念,问到了 candidate 这个问题。无解……
stl 中使用到了很多 traits 技术,只要懂得 traits ,这个问题就太简单了!以下是代码示例:
软件工程中很多地方,如果采用直接的办法不能解决问题,增加一个间接层,问题即迎刃而解,type_traits 就是这样一种技术,这个代码示例是自包含的,除了 printf ,没有任何其它外部依赖。
为什么下面这样的代码不能work?
答案:C++的重载匹配规则:如果在非模板的候选中能找到一个"精确"匹配,就不会去找模板。"精确"的精确定义包含3大类,5种具体情况,按顺序如下:
Identity Conversion ---- 不需要任何转化,最精确,级别 1
Lvalue to Rvalue Conversion -- 左值到右值转化, 级别 2
Array to Pointer Conversion --- 数组到指针转化, 级别 3
Function to Pointer --- 函数名到函数指针, 级别 4,这就是为什么很多时候我们不需要使用 &func_name 而直接使用 func_name
Quolification Conversion --- cv qualify 少的可以转化到 cv qualify 多的,级别 5
这也就是为什么下面的代码可以 work:
char -> int 不是 exact match, 是 integeral promotion.
long -> int 不是 exact match, 是 integeral conversion.
原文链接: https://www.cnblogs.com/rockeet/archive/2011/06/04/3666910.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/26756
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!