C++ 返回对本地临时对象的引用的模板类型
请考虑以下功能:C++ 返回对本地临时对象的引用的模板类型,c++,templates,type-deduction,C++,Templates,Type Deduction,请考虑以下功能: template<typename T> const T& max(const T& a, const T& b) { return b < a ? a : b; } // overload max(a, b) for char* arguments const char* max(const char* a, const char* b) { return std::strcmp(b, a) < 0 ? a
template<typename T>
const T& max(const T& a, const T& b) {
return b < a ? a : b;
}
// overload max(a, b) for char* arguments
const char* max(const char* a, const char* b) {
return std::strcmp(b, a) < 0 ? a : b;
}
template<typename T>
const T& max(const T& a, const T& b, const T& c) {
return max(max(a,b), c);
}
请您一步一步地解释一下,在这个示例中,如何推导类型,从而返回对临时对象的本地引用?您将一个char*by值从中间的2-param max()返回到三个参数max(),然后该参数通过引用返回临时对象
取而代之的是,也使用ref的char*。您还需要丢失三向最大值上的常量,这样您就不会得到常量char*const。除此之外,您还需要正确处理右值,我认为下面的代码至少更接近于此。你必须考虑一个R值限定运算符< P>,你将一个char *值从中间的2-PARAM Max()返回到你的三个参数Max(),然后通过引用返回那个临时值。 取而代之的是,也使用ref的char*。您还需要丢失三向最大值上的常量,这样您就不会得到常量char*const。除此之外,您还需要正确处理右值,我认为下面的代码至少更接近于此。在
自动结果=最大值(a、b、c)
使用T=const char*
调用第三个重载,因为它是唯一可行的重载(三个参数)
在该职能中:
template<typename T>
const T& max(const T& a, const T& b) {
return b < a ? a : b;
}
// overload max(a, b) for char* arguments
const char* max(const char* a, const char* b) {
return std::strcmp(b, a) < 0 ? a : b;
}
template<typename T>
const T& max(const T& a, const T& b, const T& c) {
return max(max(a,b), c);
}
max(a,b)
调用第二个重载:对于第一个重载,T=const char*
由模板参数推断选择。然后,为了函数重载的目的,重载1和重载2中的所有参数都被认为是完全匹配的。这是因为对于第一个重载不需要转换,对于第二个重载只需要从左值到右值的转换。因此,由于转换序列(转换序列的附加排序规则也不适用)的原因,两个重载中没有一个是首选的,而选择重载2是因为非模板函数优于模板函数
对于外部调用max(max(a,b,c)
,上述推理同样适用,只是第一个参数是const char*
类型的右值表达式,使得第二个重载不需要左值到右值的转换,而第一个重载引用绑定也被认为是完全匹配的。同样,其他转换序列排序规则均不适用
因此,后一个表达式的返回值是一个临时的const char*
,它将绑定到第三个重载返回的引用。在main
中:
自动结果=最大值(a、b、c)
使用T=const char*
调用第三个重载,因为它是唯一可行的重载(三个参数)
在该职能中:
template<typename T>
const T& max(const T& a, const T& b) {
return b < a ? a : b;
}
// overload max(a, b) for char* arguments
const char* max(const char* a, const char* b) {
return std::strcmp(b, a) < 0 ? a : b;
}
template<typename T>
const T& max(const T& a, const T& b, const T& c) {
return max(max(a,b), c);
}
max(a,b)
调用第二个重载:对于第一个重载,T=const char*
由模板参数推断选择。然后,为了函数重载的目的,重载1和重载2中的所有参数都被认为是完全匹配的。这是因为对于第一个重载不需要转换,对于第二个重载只需要从左值到右值的转换。因此,由于转换序列(转换序列的附加排序规则也不适用)的原因,两个重载中没有一个是首选的,而选择重载2是因为非模板函数优于模板函数
对于外部调用max(max(a,b,c)
,上述推理同样适用,只是第一个参数是const char*
类型的右值表达式,使得第二个重载不需要左值到右值的转换,而第一个重载引用绑定也被认为是完全匹配的。同样,其他转换序列排序规则均不适用
因此,后一个表达式的返回值是一个临时的
const char*
,它将绑定到第三个重载返回的引用。将一个char*by值从中间的2-param max()返回到三个参数max()然后通过引用返回该临时值。将一个char*by值从中间的2-param max()返回到三个参数max(),然后通过引用返回该临时值。