在阅读C++ Templates:The Complete Guide一书中的重载函数模板时,我遇到了以下示例:
// 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
} 我不明白在正常max函数的返回类型和参数类型中使用的char const* const&的含义和用途。即使我们使用char,const*,它也工作得很好。
发布于 2014-07-10 11:55:47
回复
“没有理解char const* const的含义和用途&在正常的max函数的返回类型和参数类型中使用。即使我们使用char,const*,它也工作得很好。
这可能会在书中解释(然后它是出于教学目的,只是一个糟糕的例子),或者它可能是纯粹的愚蠢。
如果您不关心严格地应用指导规则,或者只是在形式参数上没有这样的const规则,那么就没有充分的理由不使用char const* const,或者甚至只使用char const*。
如果它是教育性的,那么请注意,所有三个重载对于正式参数类型都具有相同的形式,即T const&。
例如,当你想要从模板代码中获取其中一个的地址时,这会有所帮助。
我提到这一点是因为这本书是Josuttis和Vandevorde (Daveed)写的,他们很少做愚蠢的事情。
发布于 2014-07-10 13:03:19
由于您在本书的函数模板和重载解析部分中找到了这一点,因此示例的重点是说明选择哪些函数进行重载解析。为了阐明非模板化函数是首先要考虑的问题,不管模板化函数匹配得有多好,他们都构建了char const* const&的最大示例。相反,如果函数签名是char const*,那么它就没有说教的目的了--两个模板化的函数都不匹配。
发布于 2014-07-10 16:07:58
是的,在实践中,通过常量引用返回指针是没有意义的。
但这里是本书中关于函数模板重载的部分,我认为它只是用来拟合函数模板max的返回值的定义,它是一个常量引用作为T const&,所以正常的max函数(对于类型char const*)的返回值应该是char const* const&。
https://stackoverflow.com/questions/24668194
复制相似问题