decltype() возвращаемый тип
От: Максим Рогожин Россия  
Дата: 16.10.18 18:17
Оценка:
Привет!

Почему такой кривой синтаксис?
template<typename Container>
auto get(Container& c, int i) -> decltype(c[i]);

Ведь наверное нет никаких принципиальных проблем поддержать более естественный синтаксис?
template<typename Container>
decltype(c[i]) get(Container& c, int i);

Ну и что, что c и i еще не объявлены — можно же забежать вперед и найти их.
Отредактировано 16.10.2018 18:19 Максим Рогожин . Предыдущая версия .
Re: decltype() возвращаемый тип
От: T4r4sB Россия  
Дата: 16.10.18 18:22
Оценка: +2 -1
Здравствуйте, Максим Рогожин, Вы писали:

МР>Привет!


МР>Почему такой кривой синтаксис?

МР>
МР>template<typename Container>
МР>auto get(Container& c, int i) -> decltype(c[i]);
МР>

МР>Ведь наверное нет никаких принципиальных проблем поддержать более естественный синтаксис?
МР>
МР>template<typename Container>
МР>decltype(c[i]) get(Container& c, int i);
МР>

МР>Ну и что, что c и i еще не объявлены — можно же забежать вперед и найти их.

Естественный для кого? Для сишки, которую пора выпилить нафиг из С++? Есть полно языков, где естественно тип результата объявлять уже после списка параметров.
Re: decltype() возвращаемый тип
От: reversecode google
Дата: 16.10.18 18:37
Оценка:
ну так забеги туда вперед, зачем сюда забегать ?
возьми книгу дракона по компиляторам почитай, лучше на англисйком что бы сюда вопросы копипастить и переспрашивать
Re: decltype() возвращаемый тип
От: Vamp Россия  
Дата: 16.10.18 18:43
Оценка:
Здравствуйте, Максим Рогожин, Вы писали:

МР>Привет!


МР>Почему такой кривой синтаксис?

МР>
МР>template<typename Container>
МР>auto get(Container& c, int i) -> decltype(c[i]);
МР>

МР>Ведь наверное нет никаких принципиальных проблем поддержать более естественный синтаксис?
МР>
МР>template<typename Container>
МР>decltype(c[i]) get(Container& c, int i);
МР>

МР>Ну и что, что c и i еще не объявлены — можно же забежать вперед и найти их.
Эээ... Кому забежать? Компилятор вперед не забегает, и введение новых ключевых слов в С++11 не меняло принципиальных алгоритмов работы компилятора. Странный вопрос, если честно.
Да здравствует мыло душистое и веревка пушистая.
Re[2]: decltype() возвращаемый тип
От: reversecode google
Дата: 16.10.18 18:52
Оценка:
V>Эээ... Кому забежать? Компилятор вперед не забегает, и введение новых ключевых слов в С++11 не меняло принципиальных алгоритмов работы компилятора. Странный вопрос, если честно.

да он Сеттера уже всего сюда перецитировал
как только он встречает в книге как Сеттер пишет вот "это вот так вот лучше"

он сразу бежит с вопросом "почему это вот так вот лучше ?"
Re[3]: decltype() возвращаемый тип
От: SomeOne_TT  
Дата: 17.10.18 00:25
Оценка: +3
Здравствуйте, reversecode, Вы писали:


R>да он Сеттера уже всего сюда перецитировал

R>как только он встречает в книге как Сеттер пишет вот "это вот так вот лучше"

R>он сразу бежит с вопросом "почему это вот так вот лучше ?"



Ты в каждой второй теме херами покрываешь тех, кто задает вопросы. Это токсичное, неправильное поведение. Не делай так.
Re: decltype() возвращаемый тип
От: _NN_ www.nemerleweb.com
Дата: 17.10.18 08:31
Оценка: +1
Здравствуйте, Максим Рогожин, Вы писали:

МР>Привет!


МР>Почему такой кривой синтаксис?

МР>
МР>template<typename Container>
МР>auto get(Container& c, int i) -> decltype(c[i]);
МР>

МР>Ведь наверное нет никаких принципиальных проблем поддержать более естественный синтаксис?
МР>
МР>template<typename Container>
МР>decltype(c[i]) get(Container& c, int i);
МР>

МР>Ну и что, что c и i еще не объявлены — можно же забежать вперед и найти их.

Всё может конечно.
Вопрос готовы ли вы получить ещё более медленную компиляцию ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: decltype() возвращаемый тип
От: reversecode google
Дата: 17.10.18 08:59
Оценка: -1 :)
на каждый тупой вопрос надо так же реагировать всем
а вы набирайтесь терпения еще лет на 10, он эти вопросы будет генерировать всю его жизнь

не дано Максиму Пригожину освоить программирование, впору уже в чем то другом себя попробовать
Re: decltype() возвращаемый тип
От: B0FEE664  
Дата: 17.10.18 09:05
Оценка:
Здравствуйте, Максим Рогожин, Вы писали:

МР>Ведь наверное нет никаких принципиальных проблем поддержать более естественный синтаксис?

МР>
МР>template<typename Container>
МР>decltype(c[i]) get(Container& c, int i);
МР>

МР>Ну и что, что c и i еще не объявлены — можно же забежать вперед и найти их.
Если забежать вперёд, то можно узнать, что тип возвращаемого значения может быть выведен автоматически. Достаточно написать:
auto get(Container& c, int i);

Никаких принципиальных проблем тут нет.
И каждый день — без права на ошибку...
Re[2]: decltype() возвращаемый тип
От: Ops Россия  
Дата: 17.10.18 10:01
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Естественный для кого? Для сишки, которую пора выпилить нафиг из С++? Есть полно языков, где естественно тип результата объявлять уже после списка параметров.


Да, для сишки. Это целостность в рамках языка, не хорошо, когда в одном месте так, а в другом — иначе.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[2]: decltype() возвращаемый тип
От: rg45 СССР  
Дата: 17.10.18 10:55
Оценка:
Здравствуйте, B0FEE664, Вы писали:

МР>Почему такой кривой синтаксис?

МР>
МР>template<typename Container>
МР>auto get(Container& c, int i) -> decltype(c[i]);
МР>


BFE>Если забежать вперёд, то можно узнать, что тип возвращаемого значения может быть выведен автоматически. Достаточно написать:

BFE>
BFE>auto get(Container& c, int i);
BFE>

BFE>Никаких принципиальных проблем тут нет.

Ну это как посмотреть. Оригинальный вариант возвращет lvalue, а второй — rvalue

Но есть еще один вариант:

decltype(auto) get(Container& c, int i) { return c[i]; }


Здесь опять lvalue. Но появляется новая проблема (ограничение) — к функции нельзя обратиться, пока тип результата не будет выведен. Это создает некоторый дискомфорт при написании рекурсивных функций, чего нет для первого варианта, когда тип возвращаемого значения задан явно.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 17.10.2018 11:18 rg45 . Предыдущая версия . Еще …
Отредактировано 17.10.2018 11:15 rg45 . Предыдущая версия .
Отредактировано 17.10.2018 11:11 rg45 . Предыдущая версия .
Отредактировано 17.10.2018 11:05 rg45 . Предыдущая версия .
Отредактировано 17.10.2018 11:04 rg45 . Предыдущая версия .
Re[3]: decltype() возвращаемый тип
От: _NN_ www.nemerleweb.com
Дата: 17.10.18 12:45
Оценка: +1
Здравствуйте, rg45, Вы писали:

R>Но есть еще один вариант:


R>
R>decltype(auto) get(Container& c, int i) { return c[i]; }
R>


Опасный вариант

decltype(auto) f()
{
  int i;
  return i;
}

decltype(auto) g()
{
  int i;
  return (i);
}
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: decltype() возвращаемый тип
От: rg45 СССР  
Дата: 17.10.18 12:51
Оценка: +2
Здравствуйте, _NN_, Вы писали:

R>>Но есть еще один вариант:


_NN>Опасный вариант


_NN>
_NN>decltype(auto) f()
_NN>{
_NN>  int i;
_NN>  return i;
_NN>}

_NN>decltype(auto) g()
_NN>{
_NN>  int i;
_NN>  return (i);
_NN>}
_NN>


Ну это особенность C++, за которую некоторые его недолюбливают — надо понимать, что пишешь.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[3]: decltype() возвращаемый тип
От: B0FEE664  
Дата: 17.10.18 12:54
Оценка:
Здравствуйте, rg45, Вы писали:

BFE>>Никаких принципиальных проблем тут нет.

R>Ну это как посмотреть. Оригинальный вариант возвращет lvalue, а второй — rvalue
R>Но есть еще один вариант:
R>
R>decltype(auto) get(Container& c, int i) { return c[i]; }
R>

R>Здесь опять lvalue.

Это не принципиально. Теоретически можно было бы и такой вариант поддержать:
auto& get(auto& c, auto i) { return c[i]; }

Удивлён, что вместо этого приходится писать:
auto foo(auto c, auto i) -> auto& { return c[i]; }


Здесь

R>Но появляется новая проблема (ограничение) — к функции нельзя обратиться, пока тип результата не будет выведен. Это создает некоторый дискомфорт при написании рекурсивных функций, чего нет для первого варианта, когда тип возвращаемого значения задан явно.


А вот тут я согласен: для рекурсивных функций могут быть принципиальные сложности.
И каждый день — без права на ошибку...
Re[5]: decltype() возвращаемый тип
От: Максим Рогожин Россия  
Дата: 17.10.18 16:19
Оценка:
Здравствуйте, reversecode, Вы писали:


R>на каждый тупой вопрос надо так же реагировать всем

R>а вы набирайтесь терпения еще лет на 10, он эти вопросы будет генерировать всю его жизнь

R>не дано Максиму Пригожину освоить программирование, впору уже в чем то другом себя попробовать


Не знаю, какой у вас уровень в программировании (да и не хочу знать), но как человек вы дурак дураком)
Без обид, это просто наблюдение у меня такое)
Re[2]: decltype() возвращаемый тип
От: Максим Рогожин Россия  
Дата: 17.10.18 16:53
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Естественный для кого? Для сишки, которую пора выпилить нафиг из С++? Есть полно языков, где естественно тип результата объявлять уже после списка параметров.


Естественный в смысле единообразный — в C++ принято тип результата объявлять перед именем функции.
Re[2]: decltype() возвращаемый тип
От: Максим Рогожин Россия  
Дата: 17.10.18 16:55
Оценка:
Здравствуйте, Vamp, Вы писали:

МР>>Ну и что, что c и i еще не объявлены — можно же забежать вперед и найти их.

V>Эээ... Кому забежать? Компилятор вперед не забегает, и введение новых ключевых слов в С++11 не меняло принципиальных алгоритмов работы компилятора. Странный вопрос, если честно.

Ничего странного. А откуда вам знать меняло или нет добавление новых ключевых слов принципиальные алгоритмы работы компилятора? И какие алгоритмы вы считаете принципиальными, а какие не очень?)
Re[2]: decltype() возвращаемый тип
От: Максим Рогожин Россия  
Дата: 17.10.18 16:59
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Всё может конечно.

_NN>Вопрос готовы ли вы получить ещё более медленную компиляцию ?

Не знаю на сколько медленнее, но в итоге в C++14 мы все равно это получили:
auto get(Container& c, int i) { return c[i]; }
decltype(auto) get(Container& c, int i) { return c[i]; }

Так ведь?
Re[2]: decltype() возвращаемый тип
От: Максим Рогожин Россия  
Дата: 17.10.18 17:00
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Здравствуйте, Максим Рогожин, Вы писали:


МР>>Ведь наверное нет никаких принципиальных проблем поддержать более естественный синтаксис?

МР>>
МР>>template<typename Container>
МР>>decltype(c[i]) get(Container& c, int i);
МР>>

МР>>Ну и что, что c и i еще не объявлены — можно же забежать вперед и найти их.
BFE>Если забежать вперёд, то можно узнать, что тип возвращаемого значения может быть выведен автоматически. Достаточно написать:
BFE>
BFE>auto get(Container& c, int i);
BFE>

BFE>Никаких принципиальных проблем тут нет.

Это в C++14.
Re[3]: decltype() возвращаемый тип
От: Максим Рогожин Россия  
Дата: 17.10.18 17:02
Оценка:
Здравствуйте, rg45, Вы писали:

R>Ну это как посмотреть. Оригинальный вариант возвращет lvalue, а второй — rvalue


Не совсем так — оригинальный вариант возвращает либо lvalue либо rvalue, в зависимости от того что возвращает c[i].
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.