【发布时间】:2019-03-22 08:36:04
【问题描述】:
在使用boost::any_range 时,指定不应修改底层容器(如果有)的正确方法是什么?
例如,使用别名
template<typename T>
using Range = boost::any_range<T, boost::forward_traversal_tag>;
声明一个不能修改底层容器或“数据源”内容的范围,应该声明为
const Range<T> myRange;
或作为
Range<const T> myRange;
?
我怀疑第一个版本是正确的。但是,例如,如果我应用任何boost::adaptors,是否可以保证保持容器的constness?
编辑
从documentation,显然range_iterator 元函数通过用const T 而不是T 声明范围来“推断”底层容器的constness。即range_iterator::<const T>::type是const_iterator(如果底层容器有这样的成员类型),而不是iterator,所以不能通过这个迭代器修改容器。
这是否意味着Range<const T> 也使用const_iterators 来遍历范围?
【问题讨论】:
-
Range<const T>和const Range<T>是两个非常不同的东西。第一个 (Range<const T>) 是常量T的Range。第二个 (const Range<T>) 是常量Range和非常量T。例如,这是相同的区别。std::vector<const int>和const std::vector<int>. -
@Someprogrammerdude 除了
const Range<T>可能仍然能够修改底层容器,而Range<const T>可能会推导出const的特性(即使用const_iterators 而不是iterators) 来自range_iterator元函数。那么,究竟什么是常量Range?一个使用const_iterators还是一个“包装”成员不变(但底层容器可能)? -
void f(const Range<T>)不会按照你的想法去做。见Top-level const doesn't influence a function signature。 -
@Oktalist 是的,但这不是重点。我在问
const Range<T>是否可以修改底层容器;我不是在问如何根据Rangeobject 的constness 重载函数——原则上它可以独立于底层容器的constness。该函数只是一个示例。我会澄清的。 -
@Someprogrammerdude:不过,您实际上无法创建
std::vector<const X>。
标签: c++ boost constants boost-range