Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.145.131.238] |
|
Страницы: (11) « Первая ... 5 6 [7] 8 9 ... Последняя » все ( Перейти к последнему сообщению ) |
Сообщ.
#91
,
|
|
|
Я бы хотел продолжить разговор о системе типов...
Возможно, я что-то упускаю. Хочу понять. С точки зрения практики я не понимаю, зачем так было усложнять язык. Столько всяких сложных правил из-за ссылок в системе типов(перегрузка, шаблоны и их специализация, вывод типа аргумента шаблона, auto, decltype). На первый взгляд кажется, что это бессмысленное усложнение и ссылки просто как способ передачи/возврата позволяли решить исходные проблемы без такого усложнения. Но я могу ошибаться. С точки зрения теории вообще все грустно, ИМХО. Если рассматривать типы как множество значений + множество операций, то у T& и T совпадают оба множества. Если же мы возьмём какой-нибудь TAPL, где упор делается на классификации выражений, то все становится ещё непонятнее. Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#92
,
|
|
|
Цитата D_KEY @ Без ссылочного типа можно легко обойтись, но его наличие не мешает:С точки зрения практики я не понимаю, зачем так было усложнять язык. Столько всяких сложных правил из-за ссылок в системе типов(перегрузка, шаблоны и их специализация, вывод типа аргумента шаблона, auto, decltype). На первый взгляд кажется, что это бессмысленное усложнение и ссылки просто как способ передачи/возврата позволяли решить исходные проблемы без такого усложнения. Но я могу ошибаться. void foo(S& s) { auto& f = S.field; // auto* const f = S.field; int c = f.a1 + f.a2 + f.a3; // int c = f->a1 + f->a2 + f->a3; } Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#93
,
|
|
|
Цитата applegame @ Цитата D_KEY @ Без ссылочного типа можно легко обойтись, но его наличие не мешает:С точки зрения практики я не понимаю, зачем так было усложнять язык. Столько всяких сложных правил из-за ссылок в системе типов(перегрузка, шаблоны и их специализация, вывод типа аргумента шаблона, auto, decltype). На первый взгляд кажется, что это бессмысленное усложнение и ссылки просто как способ передачи/возврата позволяли решить исходные проблемы без такого усложнения. Но я могу ошибаться. void foo(S& s) { auto& f = S.field; // auto* const f = S.field; int c = f.a1 + f.a2 + f.a3; // int c = f->a1 + f->a2 + f->a3; } Тут так же нет смысла в типе. Можно разрешить объявлять переменные-ссылки. Поведение будет то же. У f будет иметь "обычный" тип. Добавлено Ссылка/значение - это "свойство" переменной, а не типа. Т.к. единственное, что тут затронуто - вопрос об идентификации объекта. При чем тут тип? Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#94
,
|
|
|
Возьмём классику жанра:
cout << "Hello World" << someBigObject << 123 << endl; Представим, что в с++ нет ссылок, но есть ref. Как этот код будет работать и как будет выглядеть оператор вывода в поток? Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#95
,
|
|
|
Цитата Flex Ferrum @ Также как и сейчас. Ведь предлагается убрать не ссылки, а ссылочный тип. и как будет выглядеть оператор вывода в поток? Добавлено Цитата D_KEY @ В таком смысле, наверное ты прав.Тут так же нет смысла в типе. Можно разрешить объявлять переменные-ссылки. Поведение будет то же. У f будет иметь "обычный" тип. Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#96
,
|
|
|
Цитата applegame @ Цитата Flex Ferrum @ Также как и сейчас. Ведь предлагается убрать не ссылки, а ссылочный тип.и как будет выглядеть оператор вывода в поток? Ты не мудри, ты пальцем покажи. И объясни. Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#97
,
|
|
|
Цитата Flex Ferrum @ Возьмём классику жанра: cout << "Hello World" << someBigObject << 123 << endl; Представим, что в с++ нет ссылок, но есть ref. Как этот код будет работать и как будет выглядеть оператор вывода в поток? Ну как-то так ref std::ostream operator << (ref std::ostream os, const char * str) { ... return os; } ref std::ostream operator << (ref std::ostream os, ref const my_type obj) { ... return os; } ref std::ostream operator << (ref std::ostream os, int x) { ... return os; } Работать будет так же, как и ссылки сейчас. Да, в принципе, можно и синтаксис с & оставить. Я что-то упускаю? Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#98
,
|
|
|
Цитата Flex Ferrum @ Как этот код будет работать и как будет выглядеть оператор вывода в поток? А что ему принципиально будет мешать работать? Мне вот вообще интересно - что в языке сломается, если не будет правила "константная ссылка на временную переменную расширяет область видимости до области видимости ссылки". Точнее, даже два случая можно рассмотреть: 1) Что сломается, если это правило вообще убрать? 2) Что сломается, если расширить его и на неконстатные ссылки? В случае 2) вроде должен компилиться такой код: void foo(std::string &s) { s = "42"; } std::string bar() { return "24"; } foo(bar()); что вроде не так уж и плохо. Но скорей всего подобного же можно добиться и другими изменениями. А вот 1 - совершенно непонятно. Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#99
,
|
|
|
ОФФТОП.
надыбал забавные грабли в плюсах. Что выведет на экран следующая программа? #include <iostream> struct A { A (int i) { std::cout << 'A';} }; struct B { B (A a) { std::cout << 'B';} }; int main () { int i = 1; B b(A(i)); return 0; } Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#100
,
|
|
|
Цитата applegame @ ОФФТОП. надыбал забавные грабли в плюсах. Что выведет на экран следующая программа? #include <iostream> struct A { A (int i) { std::cout << 'A';} }; struct B { B (A a) { std::cout << 'B';} }; int main () { int i = 1; B b(A(i)); return 0; } Этим граблям сто лет в обед. Против них {}-инициализацию и вводили. Добавлено Цитата D_KEY @ Работать будет так же, как и ссылки сейчас. Да, в принципе, можно и синтаксис с & оставить. Что-то я тогда не пойму, в чём профит. Если и работать будет так же, и & можно оставить, то в чем отличие то будет? И *, и & всегда относились к имени переменной, а не к имени типа. Это ж букварь. Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#101
,
|
|
|
Цитата Flex Ferrum @ Что-то я тогда не пойму, в чём профит. Не будет такого типа как T &. Не будет такой специализации шаблона, например. Не будет странного типа без размера в языке. Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#102
,
|
|
|
Цитата Flex Ferrum @ И *, и & всегда относились к имени переменной, а не к имени типа. Это ж букварь. С указателем что то я не понял, с чего вдруг к имени переменной? Т.е. указатель это не тип данных? Тогда например взять void - если указатель относится к имени переменной, то почему void* ptr - я могу написать, а void p - не могу написать? И опять же тот же typeid не выкидывает * при выводе типа. Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#103
,
|
|
|
Цитата D_KEY @ Цитата Flex Ferrum @ Что-то я тогда не пойму, в чём профит. Не будет такого типа как T &. Не будет такой специализации шаблона, например. Не будет странного типа без размера в языке. А куда ж оно денется то? Вот захочешь ты передать в шаблонный метод параметр, который пришёл как ref, какого типа он будет? Добавлено Цитата KILLER @ Цитата Flex Ferrum @ И *, и & всегда относились к имени переменной, а не к имени типа. Это ж букварь. С указателем что то я не понял, с чего вдруг к имени переменной? Т.е. указатель это не тип данных? Тогда например взять void - если указатель относится к имени переменной, то почему void* ptr - я могу написать, а void p - не могу написать? И опять же тот же typeid не выкидывает * при выводе типа. Говорю же - это букварь. Если написать: int* p, c; То p будет указателем, а c - нет. Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#104
,
|
|
|
Сообщ.
#105
,
|
|
|
Цитата Flex Ferrum @ А куда ж оно денется то? Вот захочешь ты передать в шаблонный метод параметр, который пришёл как ref, какого типа он будет? Параметр, который пришел как ref T будет иметь тип T, соответственно и в шаблонный метод он придет как T. template<T> void foo(T t) {} template<T> void foo(ref T t) {} void bar(ref int a) { foo(a); fooRef(a); } Добавлено Цитата Flex Ferrum @ Но забавляют до сих пор. Этим граблям сто лет в обед. Это сообщение было перенесено сюда или объединено из темы "D vs C++" |