首页 >后端开发 >C++ >为什么指针衰减会影响 C 函数模板中的重载解析?

为什么指针衰减会影响 C 函数模板中的重载解析?

DDD
DDD原创
2024-11-24 13:10:13788浏览

Why Does Pointer Decay Affect Overload Resolution in C   Function Templates?

指针衰减和函数重载解析

在 C 中,重载解析旨在为给定的参数集选择最匹配的函数。当多个函数都是可行的候选者时,首选转换成本最小的函数。

考虑以下打印字符数组长度的函数模板:

template <size_t n>
void foo(const char (&s)[N]) {
    std::cout <p>当调用 foo( “hello”),它成功识别了模板特化并输出“array, size=5”。然而,扩展 foo 以支持非数组场景会带来歧义。</p>
<pre class="brush:php;toolbar:false">void foo(const char* s) {
    std::cout <p>现在,调用 foo("hello") 会令人惊讶地打印“raw, size=5”,尽管模板特化看起来像是更精确的匹配。</p><p><strong>歧义的原因</strong></p><p>之所以会出现歧义,是因为数组本质上是指向其第一个元素的指针,使得数组到指针的转换成本低廉。根据 C 重载解析规则,需要较少转换操作的重载是受青睐的。在这种情况下,数组到指针的转换是一种低成本的左值转换,其排名高于必要的模板参数推导。</p><p><strong>解决歧义</strong></p><p>为了确保调用数组函数重载,解决方法是将非数组重载定义为函数模板,如下所示好吧:</p><pre class="brush:php;toolbar:false">template <typename t>
auto foo(T s)
    -> std::enable_if_t<:is_convertible char const>{}>
{
    std::cout <p>这确保了模板专业化被优先考虑,因为部分排序开始了。</p></:is_convertible></typename>

以上是为什么指针衰减会影响 C 函数模板中的重载解析?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn