在 C++ 中什么时候返回 const 引用是个好主意?

Rar*_*ima 3 c++ oop reference constants

是否有任何文章介绍何时使用 const 引用作为返回类型是一个好习惯?

这不是一个关于特定问题的问题,而是一个教育问题。

我们正处于从 C 的初级水平迁移到现代 C++ 的过程中,我和我的同事的任务是指导其他一组人使用 C++,因为我们对这门语言非常熟悉。

我和这位同事就这个问题发生了轻微的争执。手头的例子是一个简单的类:

class Cls
{
private:
    vector<int> vec;

public:

    Cls() { /* put 3 random values in vec */ }

    const vector<int>& getVec() {return vec; }
};
Run Code Online (Sandbox Code Playgroud)

我的论据来自以下事实:

  1. 参考文献应该用作返回,因为您不会浪费时间复制东西。这是直接加速。

  2. 引用应该是 const,因为如果你只返回一个引用,vec那么任何人都可以仅使用 getter 来改变它,这显然是不好的。因此我们需要返回const TYPE&吸气剂。

我的同事支持返回vector<int>并完成它。他的论点是:

  1. 这是一个先进的概念,不应该从一开始就教授。我们现在可以从 getter 中按值返回(从而生成副本),并在稍后当它们能够理解幕后发生的情况时转换为引用。(我的观点是,由于我认为使用这是非常好的实践,因此应该从一开始就教授和强制执行,以便人们习惯这样做,然后我们确保每个人真正理解 const 引用含义的部分可以稍后进行因为我们可能没有时间让受训者达到可以处理参考资料的水平。)

所以我的问题基本上是:

  1. 是否有一些关于此主题的良好实践以及何时使用 const 引用而不是值作为返回值的文章?

  2. 虽然我和我的同事对 C++ 相当熟悉,但我们都没有专业地使用过它,所以……业界对于这个问题有标准或惯例吗?

rus*_*tyx 5

何时按引用返回还是按值返回的决定不仅仅是性能问题,而且是代码语义问题(尽管在使用 C++ 进行编码时性能通常很重要)。

通过引用返回的一些值得注意的示例是:

  • 通常期望getter返回对实际成员的常量引用,除非该成员的复制成本很低
  • 允许方法或运算符链接,返回对当前对象的引用 ( *this)

何时按引用返回的问题实际上可以归结为一个更广泛的问题:如何安全地管理对象的生命周期。关于对象生命周期的 C++ 核心指南是一个值得遵守的好资源。

如果被引用的对象比函数调用的寿命更长,那么通过引用返回它通常是安全的。

所以:

  • this、具有静态存储持续时间的类成员和对象:可以安全地通过引用返回它
  • 局部变量和函数的输入参数:按引用返回不安全

关于输入参数 - 它甚至适用于const引用,因为它们可以引用临时变量。例如:

std::string const& badFunc(std::string const& arg) {
   return arg; // not a good idea
}

    std::string const& x = badFunc("abc");
    // now x contains a dangling reference
Run Code Online (Sandbox Code Playgroud)