C++ C++;功能模板专门化工作?

C++ C++;功能模板专门化工作?,c++,templates,template-function,C++,Templates,Template Function,我正在阅读,16.5,定义函数模板专门化,对作者给出的示例感到困惑,让我们看看下面的模板函数: template <typename T> int compare(const T&, const T&); 模板int比较(常数T&,常数T&); 及其专门化版本: template <> int compare(const char* const &p1, const char* const &p2) { return strcm

我正在阅读,16.5,定义函数模板专门化,对作者给出的示例感到困惑,让我们看看下面的模板函数:

template <typename T> int compare(const T&, const T&);
模板int比较(常数T&,常数T&);
及其专门化版本:

template <>
int compare(const char* const &p1, const char* const &p2)
{
    return strcmp(p1, p2);
}
模板
int比较(常量字符*常量和p1,常量字符*常量和p2)
{
返回strcmp(p1,p2);
}
T
的类型将是
const char*
,但我不认为该函数可以是模板函数的专门化版本,因为我认为
const char*const&p1
只能是
T const&
的专门化,但是
const T&
,我知道我错了,但我想知道为什么我错了

编辑:


需要强调的一点是,如果我调用
compare(“hi”,“mom”)
,它将不会编译,也就是说,
template int compare(const t&,const t&)
不能初始化为
int compare(const char*const&p1,const char*const&p2)
,我知道
t
将被初始化为
char[3]
char[4],但现在编译不了,为什么编译器不理会这种初始化,而是选择一个编译的?

< p> C++,<代码> const t< /COD>和<代码> T const 意思完全相同。因此,
const T&
T const&
的意思完全相同


它实际上不可能是任何其他方式,因为引用永远不能更改为引用其他内容(它们不是“可重新放置的”)。如果您将
T const&
理解为“一个不能更改为引用不同T的引用”,则这是不正确的。这是一个对T的引用,它不能用来修改T(并且与所有引用一样,不能改变为引用不同的T)。C++中的

< P> >代码> const t< /Cord>和<代码> t const < /Case>意思完全相同。因此,
const T&
T const&
的意思完全相同


它实际上不可能是任何其他方式,因为引用永远不能更改为引用其他内容(它们不是“可重新放置的”)。如果您将
T const&
理解为“一个不能更改为引用不同T的引用”,则这是不正确的。它是“对T的引用,不能用于修改该T(与所有引用一样,不能更改为引用不同的T)。

const
可以在类型之前或之后,但指针类型除外,指针类型必须位于右侧

现在这里比较棘手的部分是,在您的示例中,
T
被设置为
const char*
,这是一种指针类型(指向
const char
)。模板说明
T
必须是
const
,并且由于它是指针类型,因此专门化中的
const
必须放在类型之后,因此您得到
const char*const

从右到左大声朗读时,它会变得更加清晰:

“指向常量字符的常量指针”

//编辑:

为什么你不能打电话给比较(“嗨”,“妈妈”)?因为编译器将这些字符数组视为不同的类型(
char[3]
char[4]
),但模板将这两个参数指定为相同的类型

这将与模板匹配,但与您的专业化不匹配(因为
T
现在是
char[2]
):

这将使用您的专用方法:

const char * hi = "hi";
const char * mom = "mom";
compare(hi, mom);
//Edit2:

“我知道T将用char[3]或char[4]初始化,…]为什么编译器不忽略这种初始化,而选择一个将编译的呢?”


因为C++是一种强类型语言。编译器不会为您做猜测工作,它会按面值接受类型。如果他们不匹配,他们就不匹配。作为开发人员,您的工作就是正确地执行它。

const
可以在类型之前或之后,但指针类型除外,指针类型必须位于右侧

现在这里比较棘手的部分是,在您的示例中,
T
被设置为
const char*
,这是一种指针类型(指向
const char
)。模板说明
T
必须是
const
,并且由于它是指针类型,因此专门化中的
const
必须放在类型之后,因此您得到
const char*const

从右到左大声朗读时,它会变得更加清晰:

“指向常量字符的常量指针”

//编辑:

为什么你不能打电话给比较(“嗨”,“妈妈”)?因为编译器将这些字符数组视为不同的类型(
char[3]
char[4]
),但模板将这两个参数指定为相同的类型

这将与模板匹配,但与您的专业化不匹配(因为
T
现在是
char[2]
):

这将使用您的专用方法:

const char * hi = "hi";
const char * mom = "mom";
compare(hi, mom);
//Edit2:

“我知道T将用char[3]或char[4]初始化,…]为什么编译器不忽略这种初始化,而选择一个将编译的呢?”


因为C++是一种强类型语言。编译器不会为您做猜测工作,它会按面值接受类型。如果他们不匹配,他们就不匹配。作为开发人员,您的工作就是把它做好。

const T
T const
之间没有区别。这解决了你的困惑吗?那么,
const T&
T const&
没有区别吗?
const T
T const
之间没有区别。这解决了你的困惑吗?所以,
const T&
T const&
没有区别,但是如果我调用
compare(“hi”,“mom”),为什么不能
模板int比较(常数t&,常数t&)
int compare(cons)初始化