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

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

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

40 ответов

31 просмотр

а зачем здесь 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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта