ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
26 апреля
905253 Топик полностью
fk0, легенда (19.02.2019 00:04, просмотров: 96) ответил fk0 на Тяжелое детство и восьмибитные игрушки никогда мне не давали понимания отличия ссылки от указателя. По-моему это просто адрес лежащий в регистре процессора. Другие концепции в голове не укладываются. А есть ли они?
Да, ещё причина, чем ссылки плохи. Они не позволяют делать, или затрудняют, какой-то introspection для классов. Допустим мы хотим итерироваться по членам класса (и всем вложенным классам) как по некому однородному дереву состоящему из узлов, содержащему другие узлы (классы), и листьев висящих на концах ветвей (примитивные типы). Мы могли бы у каждого класса, для которого предполагается интроспекция, ввести некую функцию, возвращающую итератор, позволяющий перебирать члены данного класса, получать информацию о типе члена, и рекурсивно спускаться в члены-узлы благодаря этой же функции. Функция может для каждого конкретного типа класса создавать синглтон, в котором будет хранить список членов данного класса, каким-то способом, позволяющим иметь доступ этим членам. В принципе функция могла бы конструировать список каждый раз на лету для каждого экземпляра класса и тогда проблемы с ссылками не было. Но этот список нужно где-то хранить, возвращать по-значению, если хранить в самом классе, то создаёт проблемы с конструкторами копирования и перемещения, просто в конструктор приходится вписывать инициализацию этого списка. При том, что раз все экземпляры данного типа всё равно хранят одинаковую информацию, проще и лучше использовать синглтон (потенциально это может быть вовсе constexpr класс создаваемый в момент компиляции), тогда объект обеспечивающий итерацию по членам класса представляется легковесной ссылкой на синглтон, его легко возвращать по значению и не нужно думать о выделении памяти. Но синглтон уже не может хранить ссылки на отдельные члены, как это было бы, если бы список членов создавался для каждого экземпляра. Синглтон может хранить, например, только смещения (offsetof) членов относительно некого базового класса (все классы, выполняющие интроспекцию, от которого должны быть унаследованы). И тут возникает проблема -- мы не можем получить адрес самой ссылки, мы не можем вычислить её смещение в классе. Мы не можем использовать ссылки в классах реализующих интроспекцию. Потому, что ссылки, как я писал в ответном сообщении для Ксении, не являются нормальными классами -- для них ни адрес нельзя получить, ни sizeof, они лишь алиас для другого объекта. По-моему проблема возникла не когда в C++ ввели ссылки, алиасы это хорошо, а когда ссылки не обладающими свойствами нормального объекта стало можно делать членами классов. Наверное можно ввести тезис -- ссылки вообще не желательно использовать в виде члена класса, если это не что-то специальное или приватное.
[ZX]