繁体   English   中英

函数const返回类型:类型引用的无效初始化

[英]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是可修改的,但这是引用t1t2 因此,您的代码可以“意外地”删除对象的常量性。 如果可能的话,c ++类型的系统将不安全。

从理论上讲,因为t1t2是const,所以它们可以分配在不可修改的内存中,并且当您尝试通过允许通过t3更改其中之一时,程序可能会崩溃。

您试图const Triangle的引用t转换为对可修改Triangle的引用。 那将允许调用者修改t ,这将是一件坏事。

您需要更改返回类型以使其为const

您已将函数定义为const ,即不更改对象的状态:

Triangle& Triangle::get_largest_triangle(const Triangle& t) const

问题是您返回了一个非const引用:

  • 如果返回* this,则可以使用非const引用来更改对象的状态。
  • 如果返回t,则非const引用可用于修改您说不会更改的对象。

这就是编译器抱怨的原因。 只需说您返回一个const引用即可解决您的问题:

const Triangle& Triangle::get_largest_triangle(const Triangle& t) const

将const引用传递给该方法时,编译器保证不会更改该对象。 您尝试返回同一对象的非const引用,这将导致失去其constness,并且编译器阻止您执行此操作。

重新考虑您在这里做对的事情。 为什么不能为t使用非常量引用,也不能返回常量引用?

暂无
暂无

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

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