нельзя оставить левую ссылку непроинициализированной. Мол если написать так
int x = 123;
int& y;
То компилятор будет ругаться что ссылка "y" не проиниализирована. Но выход есть! Достаточно проинициализировать эту переменную ссылкой которая также еще не проинициализирована. Согласитесь это будет эквивалентно, ведь ссылка это по сути алиас и значение для инициализации будет взято из того на что указывает ссылка которая еще не проинициализирована.
Возникает закономерный вопрос - где мы возьмем эту непроинициализированную ссылку? Так вот же она!
int x = 123;
int& y = y;
а зачем здесь x? чтобы спрашивали?
Ну это вариация известной инициализации "int x = x;" только со ссылкой. Я просто удивился что со ссылкой это оказывается тоже работает и решил поделиться (плюс мне показался забавным момент рекурсии в фразе "так вот же она!")
Ну это будет UB, а ты будешь сам себе злобный Буратино, ибо этот лом именно тот, на который тебе может быть придётся сесть. Ведь ссылку ты потом не можешь переинициализировать.
почему вместо int x = 123; int& y = y; нельзя написать просто int& y = y; ?
А действительно ли здесь UB по стандарту? В случае с "int x = x;" у нас точно UB потому что чтение еще непроинициазированной переменной это UB. Но это ведь с обычным value типом потому что стандарт допускает возможность оставить переменную непроиницилизированной. Но в случае со ссылкой ситуация другая - оставить ссылку непроиницилизированной вроде как по стандарту нельзя (и может оказаться что ее дефолтное значение и не упоминается в стандарте) но мы то ведь и не оставляем ее в примере непроиницилизированной. Кароче интересно будет разобрать этот кейс формально по стандарту
можно и так, просто дополнил строчкой предыдущий пример)
Главное, ты мозг включи, - ЗАЧЕМ всё это?
У ссылки нет другого "значения на которое она указывает", кроме того, которым оно проиничено.
Ну я думал что только value-типы можно объявить как "X x = x;" потому что переменная после знака "=" уже объявлена и дальше происходит её иницализация. И это логично так как тип можно объявить с дефолтным значением а потом позже его проинициализировать и UB не будет. А вот со ссылкой я думал что будет "name lookup" ошибка потому что объявить ссылку без инициализации нельзя и имя ссылки соотвественно должно вводиться в скоуп только после инициализации. Разве мои рассуждения нелогичны?
что ещё за value типы
ну те которые не ссылки)
Чтобы рассуждения были логичны, у них должно быть обоснование...
http://eel.is/c++draft/basic.scope#pdecl-example-1
Мне кажется зря в cxx добавили ссылки... С указателями понятнее работать, я только их и использую
А как ты операторы переопределяешь?
что возвращает разыменование указателя?
Ссылку. Я вот удивлён, как в чистом С их не ввели, они же нужны...
ну вот ответ зачем нужны ссылки
Ничего оно не возвращает, это абстракция, обращение по адресу. Мы либо получаем значение по адресу памяти либо присваиваемое туда
Это и есть ссылка...
Просто отсутствие * и -> при использовании ссылок сбивает с толку
иначе это будет не ссылка
Зачем ссылки если есть указатели? Удобство в отсутсвии надобности разыменовывания сомнительное
скажите это в стандартах >= cxx11 где, использование голых указателей является плохой практикой
А бывают не голые кроме ссылок?
std::pointer какой нибудь использовать?
есть обертки для управления динамической памятью, std::unique_ptr, std::shared_ptr, std::week_ptr
https://en.cppreference.com/book/intro/smart_pointers
А, понял, они работают за счёт того, что при вызове деструкторов этих умных указателей, они сами освобождают память обернутого типа
Sharedptr вообще на счётчик ссылок в языках с GC похож
Эти "умные" указатели вызывают утечки памяти в недревовидных программах! Много с ними подводных камней, надежнее вручную удалять объекты, чем искать такие трудноуловимые ошибки
шаблоны попробуйте пописать
Хватит кормить тролля.
что за " недревовидные программы"?
это как раз древовидные и не программы, а структуры данных
Дерево - это всё же ациклический граф)
как я понял речь идёт про древовидность, которая достигается из кода убиранием goto
Обсуждают сегодня