为什么第一个函数调用绑定到第一个函数?

MKP*_*KPS 10 c++ templates function language-lawyer overload-resolution

为什么第一个函数call(cm(car);)绑定到第一个函数?

我知道第二个调用绑定到第二个函数,因为它是非模板,尽管两者都是完美的匹配.

如果第一个函数被定义为具有固定数组长度的非模板,则:

    void cm(const char (&h)[8]) {cout << "const char (&)[8]" << endl;}
Run Code Online (Sandbox Code Playgroud)

而不是它再次被选中在第二个(第二个调用将是不明确的那种方式).

码:

template<size_t N> void cm(const char (&h)[N]) 
    {std::cout << " const (&)[N] " << endl;}

void cm(const char * h)
    {cout << " const char * " << endl;}

int main()
{
    char car[] = "errqweq";
    const char ccar[] = "errqweq";
    cm(car);
    cm(ccar);
}
Run Code Online (Sandbox Code Playgroud)

输出:

 const (&)[N]
 const char * 
Run Code Online (Sandbox Code Playgroud)

Ste*_*ora 2

因为直接写入代码中的字符串“errqweq”是只读的,因为它在运行时位于“受保护”的内存部分中,因为它被作为常量进行管理。

const char* ccar;使用 a或 a指向它const char ccar[];是正确的。您使用 const 说明符指向保存原始“errqweq”的内存:编译器确保该字符串不会被修改。

但看看:char car[] = "errqweq";

为了向您提供可修改的缓冲区(正如您在没有 const 修饰符的情况下所请求的那样),编译器在堆栈上创建一个由 8 个元素(7 个字符 + \0)组成的数组,并在其中复制(即:初始化它)字符串“errqweq” 。

因此,第一个调用使用的char buffer[8]是安全转换为const char buffer[8]. 显然,数组的固定大小可以与模板进行最佳匹配,而不是与需要“仅”常量指针的函数进行更“弱”的绑定。