在返回类型旁边使用"&"时,您是返回引用,还是仍然是逐位复制?

When using a '&' next to the return type, are you returning a reference, or is it a bit-by-bit copy still?

本文关键字:仍然是 引用 复制 返回 返回类型      更新时间:2023-10-16

当在返回类型旁边使用'&'时,您是返回引用,还是仍然是逐位复制?

的例子:

T& operator[](const int index)
{
    return m_array[index];
}

没有复制m_array[index] -返回的是对它的引用变量

您永远不会"返回引用"。对于那些希望了解更多的人来说,这是一种常见的表达方式,但如果您是新手或不确定,那么准确一点是值得的:实际情况是对函数求值会产生一个值。值有类型,而这些类型总是对象类型(即永远不会引用)。所以函数不能"返回引用";函数总是"返回一个值",如果你愿意的话。(但最好说"函数求值产生一个值"。)

唯一的问题是这个值是什么。如果一个函数被声明为U f(),其中U是一个对象类型,那么这个值就是一个临时值,它是通过复制传递的(至少名义上是这样)。但是,如果函数声明为U & f()U && f(),则值某个现有对象,并且不会创建和传递新对象。如果您愿意,这样的函数求值可以让您直接看到某些现有对象。通俗地说,我们说"f返回一个引用",但是要小心使用这种语言。

在你的例子中,m_array是一个已经存在的对象,m_array[index](大概)是该对象的某个子对象,函数求值产生那个对象(大概是某个数组元素)。

当在返回类型旁边使用'&'时,您是返回一个引用,还是它仍然是一个逐位复制?

返回对函数return语句指定的任何对象的引用(因此不应该是临时的,因为前面的m_暗示它不全是好的)。

返回对对象的引用并不是"逐位复制"的对立面…c++经常使用自定义复制构造函数和/或赋值操作符来确保正确的深度复制等。