ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
20 апреля
905252 Топик полностью
fk0, легенда (18.02.2019 23:49, просмотров: 111) ответил Ксения на Да, ссылка на нижнем уровне - указатель. Но сделали эти ссылки под под тем же давлением, которым изгоняли оператор goto :) - якобы C/C++ ненадежен и опасен именно по причине указателей, которые де могут "сойти с ума" и испортить содержимое памяти.
Для указателя всегда можно сделать враппер и определить оператор скобочки, в том числе и с проверкой диапазона, например (на что Лагунов жаловался). В том числе определить оператор скобочки для многомерных массивов и писать array[i][j][k], например. В светлом будущем обещают array[i,j,k], но боюсь можно не дожить. А с ссылкой ничего не сделать, фактически ссылка -- это алиас, второе имя. Там нет *косвенной* адресации (включая потенциальную трансформацию), только прямая. И испортить сам ссылку нельзя, но если хочется, то можно затереть разными способами (по его адресу, самой ссылки, хоть его и не узнать, но можно косвенно угадать, можно затереть нужные регистры процессора при возврате из longjmp, можно создать новую ссылку в новом скопе с тем же именем, но другим значением, посчитанным из указателя полученного из оригинальной ссылки, была бы фантазия...) Вообще по-моему проблема больше в неправильных определениях. Ссылка и указатель всё же не одно и то же. Более того, на мой взгляд существование сырого указателя скорей является проблемой C++: Ссылка -- это второе имя, алиас, адресующее непоредственно объект, напрямую. Она, фактически не является ни нормальным типом данных (для неё не посчитать ни sizeof, ни её адрес в памяти), ни обычным членом какого-либо класса (по той же причине), это очень специальная вещь. Указатель -- это обычный объект, класс определённого типа, обладающий всеми нормальными свойствами отдельного типа данных (класса). При этом он позволяет *косвенно* адресовать некий другой объект и выполнять над ним ряд предопределённых (свойствами самого указателя) функций (operator T&, operator*, operator->, operator[], да любые определить можно), сырой указатель при этом реализует ряд предопределённых операторов прозрачно проксируемых аналогичным операторам объекта, ссылку на который (вот где ссылка!) хранит класс-указатель. Проблема в том, что в C++ до сих пор нет чёткого разделения на владеющие указатели (unique_ptr, shared_ptr) и не владеющие (weak_ptr, observer_ptr), но похоже к этому придёт. И то же самое касается в какой-то ссылок, только им сложно (ввиду грамматики языка) быть владеющими или нет. Скорей ссылка -- это и есть настоящий сырой указатель, а вместо сырых указателей в остальных местах следовало бы использовать либо владеющие смарт-поинтеры, либо не владеющие указатели. Вопрос только в адресной арифметике, над чем её выполнять теперь? Смарт-поинтеры её не предполагают. Правильно, это и есть настоящий указатель, он на объект указывает, а не хранит какой-то абстрактный адрес. Возможно следовало бы ввести третий тип данных, в добавок к указателям и ссылкам, называемый адрес. И чтоб только над ним была возможна адресная арифметика, но он не должен широко использоваться в интерфейсах, например, место современных указателей должны занять смарт-поинтеры или observers.
[ZX]