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

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

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

40 ответов

26 просмотров

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

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

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

Ребят в СИ можно реализовать ООП?
Николай
33
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
Всем доброго вечера. Разрабатываю 32 раз. приложение в Delphi. Столкнулся с тем, что стандартный  TFilestream  не работает с большим файлом > 2 ГБайт (после вызова функции see...
Vadim Gl
16
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
добрый день. Подскажите, есть сайт на 1.4.7 и я хочу обновиться, особо ничего не меняя. мне выбирать версию 1.4.35 или третью ветку? и можно ли обновлять "как есть", или нужно...
Digital Cat
12
Кто кодит под Лазарем на винде, у вас аналогично VCL переопределяются CreateWnd и CreateParams для конкретных классов контролов и все заданные флаги влияют?
А Андрей
11
У меня задача: написать брокер сообщений. Очереди и потребители. Очереди поддерживают приоритеты. Очередь отдает сообщения, только обработчикам с соответствующими характеристи...
Aleksandr Filippov
2
народ, плиз хелп, всю голову сломал себе уже... разве может быть так, что GetProcAddress( GetModuleHandle( "kernel32.dll" ), "SetThreadDescription" ) вернёт ненулевое значение...
Iluha Companets
12
А, ты про текущую реализацию? Нет конечно, я бы сделал правильно - сейчас там гавнокод
Александр (Rouse_) Багель
6
Карта сайта