It has its uses. Here's one.

class G {}

class F
{
G _g; // private member g
public:
G& g() { return _g; } // if we are not const, then neither is our G
const G& g() {return _g; } // if we are const, so is our G
};

So the rule is, if the F is const then you can't mess with the G. But if its not, than you can mess with the G.

Notice that I have to write a bunch of boilerplate to extend the const bubble around the F to cover the G by overloading the g member on const. This is what I dislike about C++. You get this idea that the world should be surrounded by safety rails and you spend your whole life filling in the gaps to make sure that the safety rails cover as much ground as possible - all at the expense of writing code that just does something.