![](/img/trans.png)
[英]Why can't I directly return reference to a pointer from a function returning a pointer?
[英]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
部分。 变量value1
和value2
是对常量值的引用,但是返回对非常量值的引用。
错误解释了这一切,您不能返回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
引用的变量。
这是不允许的,编译失败。
试图在value1
和value2
上使用const_cast
来绕过这种机制是危险的,因为从最初的const
值中删除const
的行为是未定义的。
显而易见的事情是将GetMax
的返回类型更改为const
引用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.