все же Decltype(*beg) почему-то возвращает ссылку
Потому что оператор разименования возвращает ссылку, если тебе нужно значение используй std::remove_reference, возможно, даже std::remove_cv_ref
Во! этот вопрос как раз. Почему он на значение возвращает ссылку?
Потому что так в итераторе объявлено, нет?
тогда что он вернет если написать decltype(beg)?
Ещё как вариант можешь убрать тип возврата и оставить только auto, возможно, даст нужный эффект, но это не точно
в книжке какая-то странная конструкция была, что-то типа ??? вместо auto, я прифигел
Вернёт сам итератор, он же по значению принимается
то есть decltype(*beg) вернет ссылку, а decltype(beg) вернет итератор?
а это разве в данном контексте не одно и то же? Если ф-я возвращает ссылку - она возвращает указатель на память, также как и итератор
Дело в том что конструкция *beg возвращает не значение, а ссылку на значение, это посволяет меньше копировать, да и от контейнеров часто ожидается, что модификация объекта полученного через итератор, модифицирует объект внутри контейнера
то есть rvalue reference? Если она возвращает ссылку на значение, то после завершения работы ф-ии, ссылка сотрется и результат непредсказуем, разве нет?
Это немного разные сущности с разным поведением, хоть и могут быть похожи на низком уровне
имеется ввиду если ф-я возвращает указатель или ссылку, какая разница то?
Итераторы возвращают lvalue reference, я же говорил, что объект полученный через итератор должен быть объектом из контейнера, а не его копией
ага, понял, спасибо
Указатели надо ещё разыменовать, они могут быть нулевыми, и может ещё чего есть...
но при этом ты ведь не присвоишь результат работы функции, которая возвращает ссылку НЕ указателю
Результат работы функции которая возвращает ссылку, можно использовать там где допустимо использовать сам объект
Посмотри iterator_traits. Это то что тебе нужно
Обсуждают сегодня