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_;
}