怎样区分 const char* 和字符串文字量

在一个面试中,猛然间一闪念,问到了 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.

 

 

 

作者:
该日志由 csdn-whinah 于2011年06月04日发表在C++分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
转载请注明: 怎样区分 const char* 和字符串文字量
标签:
【上一篇】
【下一篇】

您可能感兴趣的文章:

3 个回复

  1. zy498420说道:

    最让人郁闷的还是,面对const char* , std::string居然竞争不过bool

  2. whinah说道:

    [reply]zy498420[/reply]
    std::string(const char*) is user defined conversion;
    const char* to bool is standard conversion;
    standard conversion has higher rank than user defined conversion.
    beside this, make bool as parameter is a bad programming style.

  3. zy498420说道:

    [reply]whinah[/reply]
    "…make bool as parameter is a bad programming style"
    That's it! But it was used in library design, not app programming.

发表评论

您必须 登录 后才能发表评论。