Answer
You can provide both const and non-const overloads of a member function; the compiler picks the const version for const objects and the non-const version for non-const objects. This is common for accessors that return a const reference for const objects and a mutable reference otherwise, avoiding code duplication (or using a const_cast helper).
struct V {
int& at(int i) { return d[i]; }
const int& at(int i) const { return d[i]; }
int d[10];
};Real-world example A container's operator[] has const and non-const overloads so const containers return read-only references.