Do not return const reference

Unless you really need to expose a read-only reference to clients (rare).


#include <iostream>

class Struct {
 public:
  Struct() {}
  Struct(const Struct&) { std::cout << "Copy constructor\n"; }
  Struct(Struct&& other) { std::cout << "Move constructor\n"; }
  Struct& operator=(Struct&& other) {
    std::cout << "Move assignment\n";
    return *this;
  }

  Struct& operator=(const Struct&) {
    std::cout << "Copy assignment\n";
    return *this;
  }

 private:
  int a = 0;
};

struct Data {
  Data() {}
  const Struct& Func1() { return a; }
  Struct Func2() { return a; }
  Struct a;
};

int main() {
  Data data;
  std::cout << "Struct a = data.Func1();" << '\n';
  Struct a = data.Func1();
  std::cout << '\n';

  std::cout << "const Struct& b = data.Func1();" << '\n';
  const Struct& b = data.Func1();
  std::cout << '\n';

  std::cout << "Struct c = data.Func2();" << '\n';
  Struct c = data.Func2();
  std::cout << '\n';

  std::cout << "const Struct& d = data.Func2();" << '\n';
  const Struct& d = data.Func2();
  std::cout << '\n';

  return 0;
}
Struct a = data.Func1();
Copy constructor

const Struct& b = data.Func1();

Struct c = data.Func2();
Copy constructor

const Struct& d = data.Func2();
Copy constructor

Thread safety is also a problem

// (Bad) Returned reference needs another synchronization to read.
const Data& GetData() {
  ReaderMutexLock lock(&mutex_protecting_data_);
  return data_;
}

Leave a Reply

Your email address will not be published. Required fields are marked *