Вас интересует разница между возвратом значения и возвращением константной ссылки исключительно в целях оптимизации, но это не так.Существует принципиально иное значение между возвратом разного значения каждый раз и возвратом ссылки каждый раз, вполне возможно, для одного и того же объекта, который вполне может быть изменен:
const Foo &a = myobj.foo();
myobj.modify_the_foo();
const Foo &b = myobj.foo();
a == b; // do you want this to be true or false?
Вызывающая сторона должна знать, каково это, потому что программист должен знать значение и потому, что компилятору необходимо знать соглашение о вызовах, чтобы вы не могли смешивать их в разных переопределениях одной и той же виртуальной функции.Если некоторые производные классы хотят сделать один, а некоторые хотят сделать другой, то это не повезло, они не могут, больше, чем один может вернуть int
, а другой * float
.
Возможно, вы могли бы вернуть shared_ptr
.Таким образом, производные классы, которые «хотят» вернуть ссылку, могут создать shared_ptr
с удалителем, который ничего не делает (но будьте осторожны - shared_ptr
будет болтаться, если исходный объект уничтожен, и это не то, что вы обычно ожидаете)от возвращенного shared_ptr
. Так что если Foo
имеет смысл пережить объект, из которого он пришел, то было бы лучше, чтобы класс динамически выделил его, удерживал его через shared_ptr
и возвращал копиюэто, а не бездельник).Производные классы, которые «хотят» вернуть значение, могут каждый раз выделять новое.Поскольку Foo
«довольно большой», мы надеемся, что стоимость shared_ptr
и динамическое распределение не слишком болезненны по сравнению с тем, что вы в любом случае сделаете, чтобы создать новое возвращаемое значение.
Другоевозможность состоит в том, чтобы превратить Foo
в небольшой класс в стиле pImpl, который ссылается на довольно большую структуру данных.Если все задействованное является неизменным, то случай «хочу вернуть ссылку» может разделить большую структуру данных между несколькими экземплярами Foo
.Даже если это не так, вы можете подумать о копировании при записи.