LINUX.ORG.RU

Ссылки и типы в C++

 , ,


0

4

Заинтересовал что-то меня вопрос о том, зачем было делать ссылки частью системы типов. Фактически они работают как синонимы, не могут храниться в массивах и пр. и пр. Я уже не говорю о привнесенной в язык сложности, которую усиливает новый стандарт посредством rvalue-ссылок.

При этом появились ссылки исключительно ради перегрузки операторов, т.к. указатели не позволяли это сделать. Если верить D&E.

Не лучше ли было сделать механизм квалификаторов для «синонимов»(что-то вроде ref в C#, только с учетом константности), чтобы программист мог указывать, что функция принимает аргумент/возвращает значение по ссылке, а не по значению. Проблему перегрузки операторов это решает полностью, сложности никакой не представляет, систему типов не усложняет.



Последнее исправление: CYB3R (всего исправлений: 1)

Ответ на: комментарий от emulek

ну ты ведь сам выше доказал, что ссылки в C++ типами НЕ являются

Что? Они являются типами. Я говорил об ограничениях и особенностях этих типов, которые достаточно серьезные, потому и хотелось бы понять, зачем это делать. Впрочем, в D было принято другое решение, там ссылки не являются типами и никаких неудобств это не доставляет, насколько я понимаю. Думаю, что в С++ так вопрос не стоял, а типами сделали из-за того, что это рассматривалось как замена указателям...

forCe
() автор топика
Ответ на: комментарий от xeiph

std::vector<T>::reference, например, для T не равного bool это T&, а для равного это специальный класс.

По-моему это не слишком удачное решение. Впрочем, сама ваша идея понятна, да.

forCe
() автор топика
Ответ на: комментарий от emulek

это не моё, это ТСа

Нет, твое.

Вот он хоче6т такую «ссылку», у которой можно спросить её адрес, и тогда, по его словам, она будет «полноценным типом».

Нет, мне такая ссылка не нужна. Я просто констатировал факт, что у ссылки нет самостоятельного значения(в отличие от указателей) - она просто обозначает синоним.

forCe
() автор топика
Ответ на: комментарий от emulek

Я всем доволен. Мне интересно, зачем делать ссылки типом с кучей ограничений, когда можно было не делать их типом.

forCe
() автор топика
Ответ на: комментарий от forCe

Я всем доволен. Мне интересно, зачем делать ссылки типом с кучей ограничений, когда можно было не делать их типом.

ещё раз повторяю: если-бы они не были типом, их бы не могла вернуть сишная функция, которая возвращает только тип. Вместо типа, который не совсем тип, пришлось бы делать функцию, которая не совсем функция. Это сломало бы совместимость с сишечкой.

emulek
()
Ответ на: комментарий от forCe

Я просто констатировал факт, что у ссылки нет самостоятельного значения(в отличие от указателей) - она просто обозначает синоним.

если бы ссылку можно было разименовать, её нужно было бы разименовать.

Да, если-бы у ссылки было значение, она была бы указателем.

emulek
()
Ответ на: комментарий от emulek

если-бы они не были типом, их бы не могла вернуть сишная функция

Она и сейчас не может ее вернуть без преобразования или хаков. В Си нет ссылок.

Вместо типа, который не совсем тип, пришлось бы делать функцию, которая не совсем функция

Да она бы точно так же возвращала указатель под капотом. В чем проблема?

forCe
() автор топика
Ответ на: комментарий от emulek

Да, я в курсе. Это не меняет вышеозвученный факт.

forCe
() автор топика
Ответ на: комментарий от forCe

Она и сейчас не может ее вернуть без преобразования или хаков. В Си нет ссылок.

в си есть функции, которые без всяких костылей работают в C++. В отличие от.

Да она бы точно так же возвращала указатель под капотом. В чем проблема?

проблема в том, что под капот запорожца можно положить разве что запаску, но никак не мотор от камаза.

emulek
()
Ответ на: комментарий от emulek

в си есть функции, которые без всяких костылей работают в C++. В отличие от.

И как это связано с тем, являются ссылки типами или нет?

forCe
() автор топика
Ответ на: комментарий от forCe

И как это связано с тем, являются ссылки типами или нет?

ну ё-моё... Функции в сишечке умеют возвращать только число, в регистре AX(eax, rax, или что там у тебя вместо этого). Вот хоть ты убейся, но это не поменять. Ибо полно кода, который следует этим соглашениям, написан на C, и не пересобираем.

Чтобы не ломать совместимость, и сделать функцию таки lvalue, необходимо не трогая саму функцию как-то иначе интерпретировать это число, как например УЖЕ разименованный указатель.

emulek
()
Ответ на: комментарий от forCe

Да в чем разница-то между & и возвращением по ссылке в этом смысле?

разница только в том, что этот твой ref делает из функции нечто странное. Потому, к каждой сраной strcmp(3) нужно писать свою обёртку, типа как в php.

emulek
()
Ответ на: комментарий от emulek

Не придется. Зачем? Мне кажется ref удобнее. Но с тайпдефами и кастами действительно не очень понятно, что делать.

anonymous
()
Ответ на: комментарий от anonymous

Не придется. Зачем?

ну за тем, что на сегодня функция в C++ является полноправным эквивалентом функции в сишечке. А у тебя появятся некие новые функции. Это тоже наверное можно, но вот Страуструп решил, что лучше сделать специальный «тип», чем специальную «функцию».

Но с тайпдефами и кастами действительно не очень понятно, что делать.

угу.

emulek
()

Допустим, интерфейсы вызова подпрограмм реализует, но как быть с адресной армифметикой, являющейся чуть ли не коронной фишкой с++?

comp00 ★★★★
()
Ответ на: комментарий от emulek

ну за тем, что на сегодня функция в C++ является полноправным эквивалентом функции в сишечке.

В сишечке нет ссылок, как нет и ref. Так что в данном случае однохерственно.

forCe
() автор топика
Ответ на: комментарий от comp00

Что? Адресная арифметика указателей пришла в С++ из С. В С ссылок нет.

forCe
() автор топика
Ответ на: комментарий от forCe

Ещё интересно, какой тип бы имела функция, которая возвращает или принимает ref. Вряд ли ей хорошо будет иметь тот же тип, что такая же функция, но без ref, потому что если кто-то ожидает указатель на такую функцию, то ему не подойдёт не такая.
Получается, что убрав ссылки из системы типов в одном месте, мы засунем их в систему типов в другом месте. (Это я попытался найти хоть какой-то смысл в постах emulek.)

И даже если так сделать, например, для std::function нужны будут большие костыли, чем сейчас.

xeiph
()
Ответ на: комментарий от xeiph

Ещё интересно, какой тип бы имела функция, которая возвращает или принимает ref. Вряд ли ей хорошо будет иметь тот же тип, что такая же функция, но без ref, потому что если кто-то ожидает указатель на такую функцию, то ему не подойдёт не такая.

Да, в D, например, так и сделано - функция и «делегаты» будут иметь тип с ref'ами(там помимо ref еще есть всякие inout, lazy и т.п.).

forCe
() автор топика
Ответ на: комментарий от xeiph

Получается, что убрав ссылки из системы типов в одном месте, мы засунем их в систему типов в другом месте. (Это я попытался найти хоть какой-то смысл в постах emulek.)

ты всё правильно понял.

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.