在阅读书籍C ++模板:完整指南中的重载功能模板时,我遇到了以下示例:
// maximum of two values of any type
template <typename T>
inline T const& max (T const& a, T const& b)
{
return a < b ? b : a;
}
// maximum of two pointers
template <typename T>
inline T* const& max (T* const& a, T* const& b)
{
return *a < *b ? b : a;
}
// maximum of two C-strings
inline char const* const& max (char const* const& a,
char const* const& b)
{
return std::strcmp(a,b) < 0 ? b : a;
}
int main ()
{
int a=7;
int b=42;
::max(a,b); // max() for two values of type int
std::string s="hey";
std::string t="you";
::max(s,t); // max() for two values of type std::string
int* p1 = &b;
int* p2 = &a;
::max(p1,p2); // max() for two pointers
char const* s1 = "David";
char const* s2 = "Nico";
::max(s1,s2); // max() for two C-strings
}
我没有得到char const * const&amp;的含义和目的。用于普通max函数的返回类型以及参数类型。即使我们使用char const *也工作正常。
答案 0 :(得分:0)
RE
“我没有得到char const * const&amp;的含义和目的。用于普通max函数的返回类型以及参数类型。即使我们使用char const *也可以正常工作。
它可以在书中解释(然后它是出于教学目的,只是一个不好的例子),或者它可能是明显的愚蠢。
没有充分的理由不仅仅使用char const* const
,甚至只是char const*
,如果你不关心严格应用指导规则,或者只是没有const
这样的规则1}}关于形式论证。
如果它是教学法,那么请注意所有三个重载都具有形式的形式参数类型,即T const&
。
这可以在你想要的时候提供帮助,例如从模板代码中获取其中一个地址。
我之所以提到这一点,是因为这本书是由Josuttis和Vandevorde(Daveed)写的,他们很少会愚蠢。
答案 1 :(得分:0)
由于您在本书的函数模板和重载解析部分中找到了这一点,因此示例的目的是说明为重载解析选择哪些函数。为了推动非模板化函数首先被考虑的点,无论模板化函数匹配得多好,它们都构造了char const* const&
的最大例子。相反,如果函数签名是char const*
,那么它将没有任何说明目的 - 模板化函数都不匹配。
答案 2 :(得分:0)
是的,实际上通过const引用返回指针是没有意义的。
但是这是本书关于函数模板重载的部分,我认为它只是用于拟合函数模板max
的返回值的定义,它是一个const引用T const&
。因此,正常max
函数(对于类型char const*
)的返回值应为char const* const&
。