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)
因为直接写入代码中的字符串“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]. 显然,数组的固定大小可以与模板进行最佳匹配,而不是与需要“仅”常量指针的函数进行更“弱”的绑定。