这是考虑因素:
1)返回副本string
。然后文档很简单(“返回...的当前值”)并且函数很慢(我怀疑在很多情况下编译器足够聪明以省略副本,即使返回值仅在一个单表达式,理论上编译器可以识别string
为无副作用副本的值类型,也可以证明在调用者使用副本期间引用不能改变,因此使用引用代替。但它会做这一切吗?)。
2)返回参考const string&
。然后文档很复杂,(“返回对string
包含的当前值的对象的引用......此引用在以下时间保持有效......它继续包含该时间的以下子集的相同值...... ”)。如果调用者不需要副本,则该函数很快。该类的实现几乎被限制为始终将该字符串存储为string
数据成员,因为否则它将没有任何东西可以在合适的生命周期内返回。
别名可能很快(如果它避免复制)但很复杂(因为引用可以更改或消失),因此返回引用的函数可能很快但很复杂。此外,(1) 是“返回对象属性的 getter”,而 (2) 是“返回对象私有成员的 getter”。所以如果吸气剂是邪恶的,那么(2)比(1)更邪恶。
I would generally return the reference if the getter is essentially there as a hack for other tightly-coupled classes to get at the data, or if the class has very obvious semantics for when it will change, for example "never during the lifetime of the object", or if the string is expected to be so huge that it's reasonable to expose it by reference simply because taking a copy of it should be rare and so callers will be expecting view behavior rather than value behavior. I'd probably return the value if the interface is supposed to be compatible-forever, just to be safe, unless the class I'm writing is explicitly designed as "a thing that holds a big string and does X for you whilst still letting you see the string".
不可变的垃圾收集字符串解决了这个问题,这可能是它们对高级语言设计者有吸引力的原因之一。