Неожиданное поведение boost::adapters:: преобразуется, когда функция преобразования возвращается по значению
Рассмотрим следующий фрагмент кода C++11, который является наименьшим воспроизводителем, который я мог придумать:
#include <iostream>
#include <boost/range/adaptor/transformed.hpp>
std::vector<uint32_t> myTransform(const std::vector<uint32_t>& iVector) {
return iVector;
}
int main() {
const std::vector<std::vector<uint32_t>> theInput{{1, 2}};
const auto myRange = theInput | boost::adaptors::transformed(myTransform);
for (auto it = boost::begin(myRange); it != boost::end(myRange); ++it) {
for (auto it2 = boost::begin(*it); it2 != boost::end(*it); ++it2) {
std::cout << *it2 << std::endl;
}
}
}
Я ожидал, что это напечатает следующий вывод:
1
2
... но вместо этого он печатает (см. http://cpp.sh/8yivt):
0
0
Однако, если я изменю myTransform
вернуть ссылку, как это:
const std::vector<uint32_t>& myTransform(const std::vector<uint32_t>& iVector) {
return iVector;
}
... тогда я получаю ожидаемый результат (см. http://cpp.sh/5brvl).
Я не смог найти объяснения этому поведению в документации Boost.Range. Мой код неверен? Мои ожидания неверны? Это ошибка / известное ограничение в Boost.Range?
Целью этого вопроса является, прежде всего, понять, почему это ведет себя неожиданным образом, и только случайно найти решение.