170 похожих чатов

Народ, я нашел забавный момент в плюсах. Все говорят что

нельзя оставить левую ссылку непроинициализированной. Мол если написать так
int x = 123;
int& y;
То компилятор будет ругаться что ссылка "y" не проиниализирована. Но выход есть! Достаточно проинициализировать эту переменную ссылкой которая также еще не проинициализирована. Согласитесь это будет эквивалентно, ведь ссылка это по сути алиас и значение для инициализации будет взято из того на что указывает ссылка которая еще не проинициализирована.
Возникает закономерный вопрос - где мы возьмем эту непроинициализированную ссылку? Так вот же она!
int x = 123;
int& y = y;

40 ответов

11 просмотров

а зачем здесь x? чтобы спрашивали?

Богдан- Автор вопроса
Bulat Ziganshin
а зачем здесь x? чтобы спрашивали?

Ну это вариация известной инициализации "int x = x;" только со ссылкой. Я просто удивился что со ссылкой это оказывается тоже работает и решил поделиться (плюс мне показался забавным момент рекурсии в фразе "так вот же она!")

Ну это будет UB, а ты будешь сам себе злобный Буратино, ибо этот лом именно тот, на который тебе может быть придётся сесть. Ведь ссылку ты потом не можешь переинициализировать.

почему вместо int x = 123; int& y = y; нельзя написать просто int& y = y; ?

Богдан- Автор вопроса
Ilya Zviagin
Ну это будет UB, а ты будешь сам себе злобный Бура...

А действительно ли здесь UB по стандарту? В случае с "int x = x;" у нас точно UB потому что чтение еще непроинициазированной переменной это UB. Но это ведь с обычным value типом потому что стандарт допускает возможность оставить переменную непроиницилизированной. Но в случае со ссылкой ситуация другая - оставить ссылку непроиницилизированной вроде как по стандарту нельзя (и может оказаться что ее дефолтное значение и не упоминается в стандарте) но мы то ведь и не оставляем ее в примере непроиницилизированной. Кароче интересно будет разобрать этот кейс формально по стандарту

Богдан- Автор вопроса
Bulat Ziganshin
почему вместо int x = 123; int& y = y; нельзя нап...

можно и так, просто дополнил строчкой предыдущий пример)

Богдан
А действительно ли здесь UB по стандарту? В случае...

Главное, ты мозг включи, - ЗАЧЕМ всё это?

Богдан
А действительно ли здесь UB по стандарту? В случае...

У ссылки нет другого "значения на которое она указывает", кроме того, которым оно проиничено.

Богдан- Автор вопроса
Ilya Zviagin
Главное, ты мозг включи, - ЗАЧЕМ всё это?

Ну я думал что только value-типы можно объявить как "X x = x;" потому что переменная после знака "=" уже объявлена и дальше происходит её иницализация. И это логично так как тип можно объявить с дефолтным значением а потом позже его проинициализировать и UB не будет. А вот со ссылкой я думал что будет "name lookup" ошибка потому что объявить ссылку без инициализации нельзя и имя ссылки соотвественно должно вводиться в скоуп только после инициализации. Разве мои рассуждения нелогичны?

что ещё за value типы

Богдан- Автор вопроса
Kelbon
что ещё за value типы

ну те которые не ссылки)

Богдан
Ну я думал что только value-типы можно объявить ка...

Чтобы рассуждения были логичны, у них должно быть обоснование...

Bulat Ziganshin
почему вместо int x = 123; int& y = y; нельзя нап...

Мне кажется зря в cxx добавили ссылки... С указателями понятнее работать, я только их и использую

Kelbon
что возвращает разыменование указателя?

Ссылку. Я вот удивлён, как в чистом С их не ввели, они же нужны...

Kelbon
что возвращает разыменование указателя?

Ничего оно не возвращает, это абстракция, обращение по адресу. Мы либо получаем значение по адресу памяти либо присваиваемое туда

Это и есть ссылка...

Ilya Zviagin
Это и есть ссылка...

Просто отсутствие * и -> при использовании ссылок сбивает с толку

Kelbon
иначе это будет не ссылка

Зачем ссылки если есть указатели? Удобство в отсутсвии надобности разыменовывания сомнительное

скажите это в стандартах >= cxx11 где, использование голых указателей является плохой практикой

Георгий Бартоломей
std::pointer какой нибудь использовать?

есть обертки для управления динамической памятью, std::unique_ptr, std::shared_ptr, std::week_ptr

Георгий Бартоломей
Спасибо, почитаю

https://en.cppreference.com/book/intro/smart_pointers

Alexander Malkov
https://en.cppreference.com/book/intro/smart_point...

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

Alexander Malkov
https://en.cppreference.com/book/intro/smart_point...

Sharedptr вообще на счётчик ссылок в языках с GC похож

Эти "умные" указатели вызывают утечки памяти в недревовидных программах! Много с ними подводных камней, надежнее вручную удалять объекты, чем искать такие трудноуловимые ошибки

это как раз древовидные и не программы, а структуры данных

Dmitriy [Отпуск]
Дерево - это всё же ациклический граф)

как я понял речь идёт про древовидность, которая достигается из кода убиранием goto

Похожие вопросы

Обсуждают сегодня

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
в сях есть множество как в питоне? для удаление дубликатов
Linus
25
читать файл максимально быстро? странный вопрос))
zamtmn
53
How to create an OS in C? what to study?
Linus
18
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
Всем доброго вечера! Хочу поделиться своим злоключением с человеком, который, как оказалось сюда тоже скидывал свое резюме. Жаль, что я вашу группу не нашел раньше… человек ки...
Роман Ахмедзянов
4
а как бы вылезти из ИО, что то типа IO -> Ether или в какую сторону смотреть ? что то туплю
Fedor
8
Компания Elif ищет менеджера проектов, который будет заниматься поиском и ведением новых проектов. Прежде чем приступить к работе, вам нужно пройти наш недельный курс, где вы ...
Elif
5
Привет, кто может сделать юзербота с апи? Задачи: - создавать группы - создавать каналы - задавать для созданных каналов аватарку или эмоджи, имя группы - добавлять в группы...
Lencore
11
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Карта сайта