通过引用返回减少了执行链式操作的时间。例如。:
a = b = c = d;
operator=
如果按值返回,让我们看看将被调用的操作。
- 复制赋值 opertor= for
c
使c
等于d
然后创建临时匿名对象(调用复制 ctor)。让我们称之为tc
。
- 然后 operator= for
b
被调用。右手边的对象是 tc。调用移动赋值运算符。b
变得等于tc
。然后将函数复制b
到临时匿名,我们称之为tb
.
- 同样的事情再次发生,
a.operator=
返回a
. 在操作员之后;
所有三个临时对象都被销毁
总共:3 个复制操作员,2 个移动操作员,1 个复制操作员
让我们看看如果 operator= 将通过引用返回值会发生什么变化:
- 调用复制赋值运算符。
c
等于d
,返回对左值对象的引用
- 相同。
b
等于c
,返回对左值对象的引用
- 相同。
a
等于b
,返回对左值对象的引用
总共:只调用了三个复制运算符,根本没有 ctors!
此外,我建议您通过 const 引用返回值,它不会让您编写棘手和不明显的代码。使用更简洁的代码查找错误会容易得多:)( a = b ).f();
最好分成两行a=b; a.f();
。
PS:复制赋值运算符:operator=(const Class& rhs)
。
移动赋值运算符 : operator=(Class&& rhs)
.