繁体   English   中英

为什么我不能从这个模板函数返回引用?

[英]Why can't I return a reference from this template function?

我直接从一本书( Sams每天一小时教你自己C ++)中拿出这个例子:

// Get the maximum of two values
template <typename objectType>
objectType& GetMax(const objectType& value1, const objectType& value2)
{
    if (value1 > value2)
        return value1;
    else
        return value2;
}

本质上,它是一个非常详细的模板函数,用于查找任何类型的2个值之间的最大值。

我试图使用如下函数:

// Test the Max function
int x_int = 25;
int y_int = 40;
int max_int = GetMax(x_int, y_int);
cout << "max_int: " << max_int << endl;

double x_double = 1.1;
double y_double = 1.001;
double max_double = GetMax(x_double, y_double);
cout << "max_double: " << max_double << endl;

但是,当我尝试编译并运行代码时,我收到以下错误:

错误1错误C2440:'return':无法从'const int'转换为'int&'

错误2错误C2440:'return':无法从'const int'转换为'int&'

错误3错误C2440:'return':无法从'const double'转换为'double&'

错误4错误C2440:'return':无法从'const double'转换为'double&'


如果我只是从函数的返回类型中删除& ,它将编译并成功执行。

为什么我不能从这个函数返回一个引用? 这本书是错的,还是我错过了什么?

这里的问题是参数声明的const部分。 变量value1value2是对量值的引用,但是返回对非常量值的引用。

错误解释了这一切,您不能返回const引用的非const引用。

// Get the maximum of two values
template <typename objectType>
const objectType& GetMax(const objectType& value1, const objectType& value2)
{
    if (value1 > value2)
        return value1;
    else
        return value2;
}

您应该指出错误引用的行(以及发布其他人可以复制/粘贴到其编辑器中的完整程序)。

但我希望他们能参考这一行

return value1;

和之后的类似之一。 错误告诉你到底出了什么问题:

cannot convert from 'const int' to 'int &'

当然,如果我们调查这条线试图做的细节,我们会发现你想要返回的东西是const:

const objectType& value1

但函数承诺返回的类型是一个nonconst引用:

objectType& GetMax

函数GetMax的返回类型是一个引用,但是您尝试返回一个const引用的变量。

这是不允许的,编译失败。

试图在value1value2上使用const_cast来绕过这种机制是危险的,因为从最初的const值中删除const的行为是未定义的。

显而易见的事情是将GetMax的返回类型更改为const引用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM