c++;模板重载带const有点难懂?

来源:百度知道 编辑:UC知道 时间:2024/05/29 16:59:38
书上有个模板题,调用模板2;去掉模板2,调用模板1;去掉模板1,调用模板0;
有些地方有点看不懂:

#include "stdafx.h"
#include <iostream>
using namespace std;
/*
模板0:
*/
template <typename T, typename U>
int FOO(T, const U*)
{return 0;}

/*
模板1:
*/
template <>
int FOO<int, const char*>(int, const char* const *)
{return 1;}

/*
模板2:
*/
template <typename T, typename U>
int FOO(T, U*)
{return 2;}

int main()
{
const char* b="abc";
cout << FOO(1, &b) << endl;
return 0;
}

const char *b="abc";
&b等价于:
const char **c=&b;
那照这样推断:
FOO(1, &b)
就应该对应模板0,怎么调用模板2啊?

模板1是模板0的重载就应该对应模板0:
参数就是:(int, const char**)
怎么是: (int, const char* const *)
“**”里面加个const是什么作用?

const char* b,b指向的对象是const的,但b自身不是const,所以FOO(1,&b)相当于传一个const char**类型,模版0,1都是带const的,只有2不带,所以调用2。

模版里出现的const都是对整个类型const的,对于指针:
const U*,则只有const char** const类型才符合,而不是const char** 或char** const,模版1只不过特列了模版0,其实模版0包含模版1的类型。

const char** z;
表示 (**z) 是常量

const char* const* z;
表示 (**z) 是常量
(*z) 也是常量

const char* const* const z;
表示 (**z) 是常量
(*z) 也是常量
(z) 也还是常量