Неожиданное поведение 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?

Целью этого вопроса является, прежде всего, понять, почему это ведет себя неожиданным образом, и только случайно найти решение.

0 ответов

Другие вопросы по тегам