При использовании boost::any_range
, как правильно указать, что базовый контейнер (если есть) не должен быть изменен?
Например, с псевдонимом
template<typename T>
using Range = boost::any_range<T, boost::forward_traversal_tag>;
для объявления диапазона, который не способен изменять содержимое нижележащего контейнера или «источника данных», если он объявлен как
const Range<T> myRange;
или как
Range<const T> myRange;
Я подозреваю, что первая версия правильная. Но гарантированно ли будет сохранен контейнер const
, если, например, я применю какой-либо из boost::adaptors
?
Редактировать
Из документации , очевидно, метафункция range_iterator
"выводит" const
из нижележащего контейнера, объявляя диапазон с const T
вместо T
. То есть range_iterator::<const T>::type
- это const_iterator
(если базовый контейнер имеет такой тип элемента), а не iterator
, поэтому контейнер нельзя изменить с помощью этого итератора.
Означает ли это, что Range<const T>
также использует const_iterators
для пересечения диапазона?