На стеке создаётся область, куда копируется значение, например тут:
void doSomething(Type obj);
Объект при передаче будет скопирован, т.е. выделится память на стеке(сдвинется указатель стека) и вызовется конструктор копирования, а после при выходе из функции деструктор
void doSomething(Type &obj);
копирования не произойдёт, т.к. передастся адрес, вообще стандарт не гарантирует, как именно реализованы ссылки но обычно как указатели. Т.е. можно думать о ссылке как об указателе с синтаксическим сахаром.
как можно вернуть псевдоним (ссылку) на тип, который размещается не в управляемой куче и вообще почему на него можно создать указатель
а почему нет? Если речь про стек, то создать то можно, другой вопрос, что указывать после выхода из функции он будет на мусор
Type& doSomething(Type& obj) {
Type anotherObj = obj;
return anotherObj;
}
int main() {
// ....
Type &obj = doSomething(something);
// здесь при работе c obj будет UB
// ....
}