Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回对本地临时对象的引用的模板类型_C++_Templates_Type Deduction - Fatal编程技术网

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。除此之外,您还需要正确处理右值,我认为下面的代码至少更接近于此。在主< <代码>:

中,必须考虑R值限定运算符< P>
自动结果=最大值(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(),然后通过引用返回该临时值。