смысл ссылок в том, чтобы они были неотличимы от исходной переменной

когда у псевдонима заканчивается время жизни, объект не уничтожается нельзя сделать ссылку на ссылку lvalue ссылку нужно инициализировать lvalue нельзя неконстантную ссылку инициализировать rvalue

dangling reference (битая ссылка) - UB будет если вернуть из функции ссылку на (локальную) переменную, которая сдохла

int*& // ссылка на указатель
int&* // CE
int(&arr)[10] = {...} // ссылка на массив
//например можно сделать функцию, которая будет принимать массив определенного размера по ссылке
void f(int (&a)[5]) {}
int arr[5] = {1,2,3,4,5};
f(arr);
int& c[10] // массив ссылок нельзя

если сделать +1 от указателя на массив, то шаг будет sizeof(массив)

&reference - адрес от ссылки это адрес исходного объекта

int& f(int) //функция, которая принимает инт, возвращает ссылку на инт`
int (&f)(int) // ссылка на функцию, которая принимает инт, возвращает инт`
 
int& const x = 1; // CE (ссылка и так всегда константная)`
 
void f(const std::string&);
f("aboba"); // "aboba" это lvalue (имеет область в статической памяти)

в константный аргумент функции можно подать rvalue f(std::string("aboba")) - теперь подается prvalue

константные ссылки можно инициализировать через rvalue const int& n = 5; так можно продлить время жизни локальной переменной из функции

lifetime expansion (создать строку “на стеке” (создать на стеке указатель в дин. память)) const string& s = std::string(“aaa”); - ведёт себя как обычная const string обращение к строке валидно, пока жив s константные ссылки тоже могут быть dangling ref нужно быть очень аккуратным, когда есть поля ссылки

void g(size_t& y) {
	y++;
}

int x = 0; g(x) - x не увеличится, тк увеличилась бы временная копия сконверченный size_t x, но это CE мы не можем засунуть инт, где функция принимает size_t&, потому что int != size_t, но если попробуем сконвертить, то получится rvalue

ссылка пофакту константный указатель и поэтому константные методы позволяют изменять значение поля, которое является ссылкой (тк от навешивания const на const указатель ничо не изменится и через него все равно можно будет менять то, что хранится по ссылке)

move semantics