![](/img/trans.png)
[英]find_if error: invalid initialisation of reference of type 'const node&' from expression of type 'node*'
[英]Function const return type: invalid initialisation of reference of type
我有这个功能:
Triangle& Triangle::get_largest_triangle(const Triangle& t) const
{
float area_this = get_area();
float area_other = t.get_area();
if (area_other > area_this)
return *this;
else
return t;
}
除非我声明返回的Triangle为常数,否则它将无法正常工作,即:
const Triangle& Triangle::get_largest_triangle(const Triangle& t) const
为什么是这样? 我对C ++还是相当陌生,但据我所知,函数中的“ this”和参数列表中的对象都没有更改,因此我并没有真正看到问题所在。
例如,如果要在运行此功能后更改存储在最大Triangle中的某些值,该怎么办?
此函数返回对Triangle的非常量引用。 这意味着调用者可以修改返回的对象。 但是它返回对自身的引用(由于函数声明而为const),或对函数参数的引用(也为const)。 因此编译器将不允许它,因为您使const对象成为非const对象。
您的选择是更改函数签名以返回const:
const Triangle& Triangle::get_largest_triangle(const Triangle& t) const
或者使该方法成为非常量并采用非常量引用:
Triangle& Triangle::get_largest_triangle(Triangle& t)
返回t
,将返回const Triangle&
,这是t
的类型。
当您声明要返回Triangle&
函数时,您将返回不同的类型。 请记住, const
是该类型的一部分。
Triangle&
不是const Triangle&
。
只需将get_largest_triangle
的返回类型更改为const Triangle&
,或将t
的类型更改为Triangle&
。 两者都有其优点和缺点。
考虑使用以下功能
const Triangle t1, t2;
Triangle &t3 = t1.get_largest_triangle(t2);
现在t3
是可修改的,但这是引用t1
或t2
。 因此,您的代码可以“意外地”删除对象的常量性。 如果可能的话,c ++类型的系统将不安全。
从理论上讲,因为t1
和t2
是const,所以它们可以分配在不可修改的内存中,并且当您尝试通过允许通过t3
更改其中之一时,程序可能会崩溃。
您试图const Triangle
的引用t
转换为对可修改Triangle
的引用。 那将允许调用者修改t
,这将是一件坏事。
您需要更改返回类型以使其为const
。
您已将函数定义为const
,即不更改对象的状态:
Triangle& Triangle::get_largest_triangle(const Triangle& t) const
问题是您返回了一个非const引用:
这就是编译器抱怨的原因。 只需说您返回一个const引用即可解决您的问题:
const Triangle& Triangle::get_largest_triangle(const Triangle& t) const
将const引用传递给该方法时,编译器保证不会更改该对象。 您尝试返回同一对象的非const引用,这将导致失去其constness,并且编译器阻止您执行此操作。
重新考虑您在这里做对的事情。 为什么不能为t使用非常量引用,也不能返回常量引用?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.