Присвоение boost :: iterator_range единственному диапазону - PullRequest
1 голос
/ 06 сентября 2010

Я использую Boost.Range для передачи некоторых данных и класса контейнера для этих данных. Данные загружаются в другой поток и в некоторых случаях могут быть еще не готовы. В этом случае контейнер инициализируется по умолчанию iterator_range, следовательно, содержит особые итераторы. Я делаю назначения и копирование контейнеров данных (отсюда итератор_ranges). Однако конструктор копирования iterator_range вызывает begin () и end (), которые будут утверждать, когда оригинал является единичным. Поэтому невозможно скопировать пустой контейнер данных.

Есть ли способ обойти это ограничение?

Почему введено это ограничение? Следующее работает просто отлично, разве диапазоны не должны вести себя одинаково?

typedef std::vector<int>::iterator iterator;
iterator it; // Singular
iterator it2 = it; // Works

boost::iterator_range<iterator> range; // Singular
boost::iterator_range<iterator> range2 = range; // Asserts in debug, but why?

1 Ответ

3 голосов
/ 06 сентября 2010

Если под словом «работает» вы подразумеваете «он не взрывается с моей текущей версией компилятора и параметрами вызова», то да, назначение единственного итератора может «работать».На самом деле, код

typedef std::vector<int>::iterator iterator;
iterator it; // Singular
iterator it2 = it; // Works

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

Стандарт C ++ говорит об этом (раздел[lib.iterator.requirements] / 5):

[...] Результаты большинства выражений не определены для единичных значений;единственное исключение - это присвоение не единственного значения итератору, который содержит единственное значение.В этом случае единственное значение перезаписывается так же, как и любое другое значение.Разыменовываемые значения и значения конца-конца всегда не единственные.

Таким образом, в конечных диапазонах do работают подобно одиночным итераторам.Это просто не работает так, как хотелось бы.Я думаю, что лучший способ - использовать пустой диапазон (явно созданный для неособых итераторов), когда данные еще не готовы, вместо единственного диапазона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...