是否有任何文章介绍何时使用 const 引用作为返回类型是一种好的做法?
这不是一个关于特定问题的问题,而是一个教育问题。
我们正处于从 C 的初级水平迁移到现代 C++ 的过程中,我和我的同事的任务是指导其他一组人使用 C++,因为我们对这门语言非常熟悉。
我和那位同事就这个问题发生了轻微的争执。手头的例子是一个简单的类:
class Cls
{
private:
vector<int> vec;
public:
Cls() { /* put 3 random values in vec */ }
const vector<int>& getVec() {return vec; }
};
我的论据来自以下事实:
参考文献应该用作回报,因为你不会浪费时间复制东西。这是直接加速。
引用应该是 const,因为如果你只返回对
vec
的引用,那么任何人都可以仅使用 getter 来改变它,这显然是不好的。因此我们需要为 getter 返回 const TYPE&
。
我的同事支持直接返回
vector<int>
就可以了。他的论点是:
所以我的问题基本上是:
是否有一些关于此主题的良好实践以及何时使用 const 引用而不是值作为返回值的文章?
虽然我和我的同事对 C++ 相当熟悉,但我们都没有专业地使用过它,所以……业界对于这个问题有标准或惯例吗?
何时按引用返回还是按值返回的决定不仅仅是性能问题,而且是代码语义问题(尽管在 C++ 中编码时性能通常很重要)。
通过引用返回的一些值得注意的示例是:
*this
)何时按引用返回的问题实际上归结为一个更广泛的问题:如何安全地管理对象的生命周期。 关于对象生命周期的 C++ 核心指南是一个值得遵守的好资源。
如果被引用的对象比函数调用的寿命更长,那么通过引用返回它通常是安全的。
所以:
this
,具有静态存储持续时间的类成员和对象:安全通过引用返回它
局部变量和函数的输入参数:不安全通过引用返回。对于输入参数,它甚至适用于
const
引用,因为它们可以引用临时变量。例如:
std::string const& badFunc(std::string const& arg) {
return arg; // not a good idea
}
int main() {
std::string const& x = badFunc("abc");
// now x contains a dangling reference!
// ...
}
首先,你必须思考你想要实现什么。您是否确实需要访问权限来执行数据的特定实例,或者副本是否适合您。如果是拳头,那么没有其他办法,那就使用引用或者指针。但请注意,返回的 const 引用并不能保证指向的对象不会更改。它只是说调用者不能修改它,但可以在被调用者对象内部更改它。
当然,有一些 100% 有效的返回引用的用法,例如用于制作数据流。