Если метод является константным, то компилятору гарантируется, что состояние объекта не может быть изменено путем вызова метода.
Если метод возвращает ссылку на внутренний элемент, то пользователь метода может косвенно изменить состояние объекта через ссылку.
Таким образом, метод const не может возвращать ссылку (потому что он позволяет косвенно изменять состояние объекта). Что вы можете сделать, это вернуть константную ссылку. Таким образом, предоставляя пользователю доступ к внутренним элементам, но поддерживая контракт с клиентом.
Пример:
class X
{
int& getX(); // get a reference to X
int const& getX() const; // get a reference to X BUT the interface guarantees
// the object will not change state.
private:
int x;
};
Еще один способ взглянуть на это.
Если у вас есть объект const. Вам разрешено только разрешено вызывать методы const. Если, вызвав метод const, вы можете получить ссылку на внутренний член объекта, вы можете изменить его состояние. Это нарушило бы const (ness) исходного объекта.