为啥在向量类中实现 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 错误?