Информация об изменениях

Сообщение Re[2]: decltype() возвращаемый тип от 17.10.2018 10:55

Изменено 17.10.2018 11:15 rg45

Re[2]: decltype() возвращаемый тип
Здравствуйте, 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. Но появляется новая проблема (ограничение) — к функции нельзя обратиться, пока тип результата не будет выведен. Например, такие функции не могут быть рекурсивными, в отличие от первого варианта, когда тип возвращаемого значения задается явно.
Re[2]: decltype() возвращаемый тип
Здравствуйте, 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. Но появляется новая проблема (ограничение) — к функции нельзя обратиться, пока тип результата не будет выведен.