为啥在向量类中实现 operator= 时返回 const 引用

Posted

技术标签:

【中文标题】为啥在向量类中实现 operator= 时返回 const 引用【英文标题】:Why return const reference when implement the operator= in vector class为什么在向量类中实现 operator= 时返回 const 引用 【发布时间】:2015-03-18 11:39:07 【问题描述】:

我从“C++ 中的数据结构和算法分析”中读到它。成员函数operator= 的返回类型为const Vector&。我想知道向量是否可以稍后修改?

C++ Primer 说我们不能改变一个 const 引用,它给出了这个例子:

const string& shorterString(const string& s1 , const string& s2)

shorterString("hi","bye") = "X" //wrong 

【问题讨论】:

标准做法是从operator=返回一个非常量引用。 你到底在问什么? 如果返回类型是const引用,以后可以修改vector吗? 你问的是“向量”还是“字符串”?你问的是“operator=”还是“const”的行为? 也许,但不是通过返回的参考。这就是const 的意思。 【参考方案1】:

通常operator= 返回对调用者的非常量引用。例如,您可以在 STL 的类中看到这一点。 然而,返回类型并不重要,因为从赋值中返回一些东西是一个额外的效果,例如,允许链接:

a = (b = (c = d));
(a = b).callMethod();

operator= 也可以是void,并且赋值表达式不能在其他地方使用。但是它们仍然可以工作,修改它的参数并让它保持可修改,即非常量:

A a, b, c;
b = c; //call, say, void A::operator=(const A &)
a = b; //ditto
//a = b = c; //impossible here
a = c; //works

所以,a 的修改与赋值运算符的返回类型无关,而与它的副作用有关。

至于您的第二个示例,shorterString 获取两个 const-reference 并返回其中一个,显然应该将其保留为 const。如果您需要以非const 的方式处理结果,则还必须使用非const 参数:string& shorterString(string& s1, string& s2)。这两个函数可以重载,编译器会选择一个合适的。

【讨论】:

以上是关于为啥在向量类中实现 operator= 时返回 const 引用的主要内容,如果未能解决你的问题,请参考以下文章

当我在网格/面中实现索引时,为啥它会返回 OpenGL 错误?

当我尝试增加矩阵大小时,在 AMD openCL/C 中实现矩阵向量乘法会导致系统死机

为啥向量总是比 C 数组慢,至少在这种情况下?

通过迭代基类向量在派生类中实现的调用方法

具有抽象继承的后缀运算符++

如何从返回向量的函数中获取向量值?