Сообщение Re[2]: decltype() возвращаемый тип от 17.10.2018 10:55
Изменено 17.10.2018 11:11 rg45
Re[2]: decltype() возвращаемый тип
Здравствуйте, B0FEE664, Вы писали:
МР>Почему такой кривой синтаксис?
МР>
BFE>Если забежать вперёд, то можно узнать, что тип возвращаемого значения может быть выведен автоматически. Достаточно написать:
BFE>
BFE>Никаких принципиальных проблем тут нет.
Ну это как посмотреть. Оригинальный вариант возвращет lvalue, а второй — rvalue
Но есть еще один вариант:
Здесь опять lvalue.
МР>Почему такой кривой синтаксис?
МР>
МР>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, Вы писали:
МР>Почему такой кривой синтаксис?
МР>
BFE>Если забежать вперёд, то можно узнать, что тип возвращаемого значения может быть выведен автоматически. Достаточно написать:
BFE>
BFE>Никаких принципиальных проблем тут нет.
Ну это как посмотреть. Оригинальный вариант возвращет lvalue, а второй — rvalue
Но есть еще один вариант:
Здесь опять lvalue. Но появляется новая проблема (ограничение) — к функции нельзя обратиться, пока тип результата не будет выведен. Например, такие функции не могут быть рекурсивными, в отличие от первого варианта, когда тип возвращаемого значения задается явно.
МР>Почему такой кривой синтаксис?
МР>
МР>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. Но появляется новая проблема (ограничение) — к функции нельзя обратиться, пока тип результата не будет выведен. Например, такие функции не могут быть рекурсивными, в отличие от первого варианта, когда тип возвращаемого значения задается явно.