Когда допустимо возвращение ссылки в функции?
Если я правильно понял ваш вопрос (1-й из 2-х ;-)):
1. возврат ссылки имеет смысл тогда, когда не хочется
копировать большой возвращаемый объект через стек
2. поэтому довольно странный ваш пример int& func() - int ничуть не короче адреса, поэтому ссылка здесь не имеет никакого смысла
3. при возврате ссылки нужно следить (очень частая и тяжёлая ошибка), чтобы объект, на который возвращается ссылка, не был локальным в функции, и существовал к моменту возврата (это не проблема в языках с подсчётом ссылок, например, Go, но в C++ это проблема):
int& func() {
int x = ...
return x;
}
int& func( int x ) {
x = ...
return x;
}
- это будет тяжёлая ошибка.
А вот так будет нормально:
int x;
int& func() {
x = ...
return x;
}
int& func() {
static int x;
x = ...
return x;
}
int& func( int& x ) {
x = ...
return x;
}
Естественно, int в этих примерах - бессмысленно ... но подставьте вместо него объект любого класса.