LINUX.ORG.RU

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

 , ,


0

4

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

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

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


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

Нет, ты точно читать не умеешь. ТС такого не говорил

можешь переведёшь на русский, чем ТС недоволен?

emulek ()
Ответ на: комментарий от 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 ()
Ответ на: комментарий от emulek

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

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

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

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

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

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

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

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

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

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

угу.

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

к каждой сраной strcmp(3) нужно писать свою обёртку, типа как в php.

Нет, не пришлось бы.

forCe ()

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

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

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

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

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

Для ссылок нет адресной арифметики, а указатели я заменять не предлагал.

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

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

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

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

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

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

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

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

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

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

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

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

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

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