Recentemente ho avuto una discussione in cui sostenevamo se fosse una buona idea rendere tutto const, se possibile.
L'argomento è andato così: se espongo una parte interna della classe restituendo un riferimento non-const ad esso, non dovrei fare quel getter const anche se è possibile.
Ad esempio:
class Foo
{
std::unique_ptr<int> bar;
public:
Foo()
: bar{std::make_unique<int>(10)}
{
}
int& getBar() const // <-- we argued about that const here
{
return *bar;
}
};
int main()
{
const auto foo = Foo{};
foo.getBar()++;
}
Il codice dall'alto funziona solo perché int
non è memorizzato nella memoria di Foo
stesso. Se sostituissi unique_ptr
con un normale int
ma mantieni l'interfaccia pubblica della classe uguale, il compilatore emetterà un errore:
class Foo
{
int bar;
public:
Foo()
: bar{10}
{
}
int& getBar() const
{
// error: binding reference of type 'int&' to 'const int' discards qualifiers
return bar;
}
};
int main()
{
const auto foo = Foo{};
foo.getBar()++;
}
È una buona idea rendere intenzionalmente una funzione getter non-const se espone qualcosa di interno alla classe come riferimento non const?