смысл ссылок в том, чтобы они были неотличимы от исходной переменной
когда у псевдонима заканчивается время жизни, объект не уничтожается нельзя сделать ссылку на ссылку 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 указатель ничо не изменится и через него все равно можно будет менять то, что хранится по ссылке)