Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.22.249.158] |
|
Страницы: (11) « Первая ... 7 8 [9] 10 11 все ( Перейти к последнему сообщению ) |
Сообщ.
#121
,
|
|
|
Цитата D_KEY @ Цитата Flex Ferrum @ Я уже говорил: пример показывает, что ссылка - это не часть типа "вообще", а часть типа конкретного параметра, часть объявления параметра. Достигается это за счёт кучи правил и исключений из них. T& является типом в C++, но с кучей всяких исключений и дополнительных правил. Что в итоге приводит к тому, что он часто ведёт себя не как тип И непонятно зачем это все сделано. Вот я и думаю, а что бы было, если бы в язык вместо непонятного типа ввели доп. возможность указывать способ передачи/возврата в/из функции(да и фиг с ним, пусть и локальные синонимы разрешили делать), без изменения системы типов. Правила довольно простые. Система типов не "обогащается" такими странными "полутипами". Пользователи языка не мучаются, даже если начинающие. Вопросы о связи указателей и ссылок вряд ли бы возникали так часто, как сейчас. Разработчикам компиляторов так же было бы намного легче. Добавлено Но у меня смутное чувство, что я что-то упускаю. И возможно это не ошибка дизайна языка, а какой-то гениальный ход, который до меня не доходит. Я думаю, что если ты попробуешь описать поведение этой замены ссылкам - ты получишь ровно те же яйца, только с видом в профиль. Для верности можешь заглянуть в спецификацию ссылок в стандарте и выкинуть то, что считаешь "лишним" для нового, правильного ref. Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#122
,
|
|
|
Этого будет мало Там половину стандарта нужно будет поправить, убрав особое поведение для ссылок.
Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#123
,
|
|
|
Цитата D_KEY @ А что особенного в поведении ссылок, кроме продления жизни временным объектам?Этого будет мало Там половину стандарта нужно будет поправить, убрав особое поведение для ссылок. Сдается мне, что в плюсах и так не существует ссылочного типа. #include <iostream> #include <typeinfo> using namespace std; int main() { const int& a1 = 10; const int a2 = 10; cout << (typeid(a1) == typeid(a2)); return 0; } Типы идентификаторов a1 и a2 одинаковы. Расходимся. Кстати, зачем запретили для ссылок sizeof и получение указателя? Было бы логично выполнять эти операции для объекта, на который указывает ссылка? А то сейчас ссылка в плюсах похожа на симлинк, а в идеале должна быть похожа на хардлинк. Добавлено Хотя нет. Скорее симлинк - это указатель, а хардлинк - ссылка. Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#124
,
|
|
|
Цитата applegame @ Типы идентификаторов a1 и a2 одинаковы. Так я про то и говорю всю тему Цитата Расходимся. А теперь поработай над самим типом в статике Поиграй с type_traits. Или подумай над специализацией шаблона. Цитата Кстати, зачем запретили для ссылок sizeof и получение указателя? Было бы логично выполнять эти операции для объекта, на который указывает ссылка? Так и есть Добавлено В смысле оно и работает так, как ты хочешь. Т.е. в язык зачем-то добавили тип, а затем прописали для него кучу правил, которая фактически приводит к тому, что он ведёт себя не как тип в очень многих случаях. Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#125
,
|
|
|
Цитата D_KEY @ Т.е. в язык зачем-то добавили тип D_KEY, сколько раз мне ещё нужно написать, что ссылка не является полноценным типом, чтобы ты, наконец, смог это прочитать это так, как написано? Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#126
,
|
|
|
Цитата Flex Ferrum @ Цитата D_KEY @ Т.е. в язык зачем-то добавили тип D_KEY, сколько раз мне ещё нужно написать, что ссылка не является полноценным типом, чтобы ты, наконец, смог это прочитать это так, как написано? Я тебе сказал, что нужно делать Приведи пруфы. Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#127
,
|
|
|
Ну а я считаю иначе. Цитата applegame @ Не выкручивайся. Ты же сказал, что продемонстрировал то о чем говорит Qraizer, а оказалось наоборот. Я продемонстрировал, как компилятор может оптимизировать ссылки и не оптимизировать указатели в схожих ситуациях. Я не знаю, что ты там увидел, но показывал я именно это. И ассемблерный код это подтверждает. Да нет. Я явно сказал компилятору, что можно, а что нельзя, причём корректными средствами. А не с помощью злобных кастов от одного к другому. Понятно, что можно (при желании) сделать ссылку на null, и две разные ссылки на одну область памяти с разными типами. Но это всё как раз из серии хаков и говнокода. Батенька, тут показано именно то, о чём я говорил. Ссылка на временный объект (внезапно) начинает "держать" этот объект. Компилятор так решил. Вот тут, внезапно, ссылка превращается... Превращается ссылка... Во временный объект: #include <cstdio> struct Val { int val; }; Val GetVal() { return Val{20}; } void Refs1() { volatile int a = 10; const Val& b = GetVal(); const volatile int* volatile c = &b.val; std::printf("%d", a); std::printf("%d", b.val); std::printf("%d", *c); std::printf("%p", c); } С чего бы это? Ведь ссылка - это не более, чем сахарный константный указатель? Цитата applegame @ Или он и так не считает? если я обявлю две переменные int& и int, будет ли компилятор считать, что их типы разные? Вроде ты сам на этот вопрос ответил. Цитата applegame @ Что правда? Ну давай расскажи, как можно схлопотать проблемы с pointer aliasing не говнокодя и как ссыоки помогут бороться с этими проблемами. Бинарную десериализацию никогда не писал? Там такие штуки ловятся "на раз", если не знать, где грабли зарыты. Цитата applegame @ То есть ты намеренно смухлевал? Расскажи еще, что ты знал, что ссылки на временные объекты возвращаемые из функций нельзя биндить даже к константным ссылкам. Ты, похоже, неправильно прочитал собою же процитированное из стандрата. Ты же сам привёл пример (https://ideone.com/CkeMhZ ), где константная ссылка прекрасно "держит" временный объект, возвращённый функцией. Добавлено Цитата D_KEY @ Приведи пруфы. Пруфы чего? А могу я попросить тебя привести пруфы того, что ссылка (в c++) - это самостоятельный тип? Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#128
,
|
|
|
Цитата D_KEY @ Ну разве что зачем-то раpрешены странные конструкции типа таких:А теперь поработай над самим типом в статике Поиграй с type_traits. Или подумай над специализацией шаблона. template<typename T> struct A { T a; }; template<typename T> struct A<T&> { T b; }; и typedef int& T; Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#129
,
|
|
|
Цитата applegame @ Ну разве что зачем-то раpрешены странные конструкции типа таких: Ну, когда ты разбираешь декларацию функции, где какой-то параметр может быть помечен ссылкой, то таки да, у тебя будет срабатывать вторая специализация. Ну а затайпдефить ты можешь что угодно. Тут так же, как и с указателями - несмотря на то, что "указатель" относится к декларации (а не к типу), ты можешь затайпдефить его и использовать. Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#130
,
|
|
|
Цитата Flex Ferrum @ Тут так же, как и с указателями - несмотря на то, что "указатель" относится к декларации (а не к типу), ты можешь затайпдефить его и использовать. Это исключительно вопрос синтаксиса. Указатели являются типом. И, в отличие от ссылок, типом полноценным. Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#131
,
|
|
|
Цитата D_KEY @ Указатели являются типом. И, в отличие от ссылок, типом полноценным. Да? А пруф можно? Может ещё и константность типом является? Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#132
,
|
|
|
Цитата Flex Ferrum @ Пруфы чего? Того, что ссылка является, как ты выразился, модификатором типа. Хотя ты и сам знаешь, что в стандарте этого нет Цитата А могу я попросить тебя привести пруфы того, что ссылка (в c++) - это самостоятельный тип? Что такое самостоятельный тип? И чем он отличается от несамостоятельного? Ты считаешь, что в C++ нет типа int&? Или что? Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#133
,
|
|
|
Цитата D_KEY @ Что такое самостоятельный тип? И чем он отличается от несамостоятельного? Забудь. Приведи пруфы того, что ссылка в C++ - это тип (в твоём понимании). Цитата D_KEY @ Ты считаешь, что в C++ нет типа int&? Я считаю, что в C++ есть тип int (относится к категории фундаментальных), и что есть декларации, тип которых может быть "ссылка на тип int". Это знаешь, как у Хайдеггера (в переводе) термин "бытие" может использоваться в пяти разных смыслах. Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#134
,
|
|
|
Цитата Flex Ferrum @ Цитата D_KEY @ Указатели являются типом. И, в отличие от ссылок, типом полноценным. Да? А пруф можно? Цитата 8.3.1 Pointers 1 In a declaration T D where D has the form * attribute-specier-seqopt cv-qualier-seqoptD1 [dcl.ptr] and the type of the identier in the declaration T D1 is derived-declarator-type-list T,then the type of the identier of D is derived-declarator-type-list cv-qualier-seq pointer to T. Цитата Может ещё и константность типом является? const int является типом, да. Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#135
,
|
|
|
D_KEY, ты ответь. const в С++ - это тип или нет? А volatile? А массив? А функция?
Это сообщение было перенесено сюда или объединено из темы "D vs C++" |