提问人:Anakhand 提问时间:3/22/2019 最后编辑:Anakhand 更新时间:3/24/2019 访问量:209
声明 'const' 'boost::range 's 的正确方式
Proper way of declaring `const` `boost::range`s
问:
使用 时,指定不应修改基础容器(如果有)的正确方法是什么?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
编辑
从文档中可以看出,显然元函数通过声明范围 而不是 .也就是说,is(如果基础容器具有此类成员类型)而不是 ,因此无法通过此迭代器修改容器。range_iterator
const
const T
T
range_iterator::<const T>::type
const_iterator
iterator
这是否意味着它也用于遍历范围?Range<const T>
const_iterators
答:
0赞
Anakhand
3/24/2019
#1
显然,确保值不被修改的正确方法都不是我提到的。
从 Boost.Range 的文档中,我们可以看到它采用了以下模板参数:any_range
template<
class Value
, class Traversal
, class Reference
, class Difference
, class Buffer = any_iterator_default_buffer
>
class any_range;
我强烈怀疑声明“常量范围”的方法是指定为类型模板参数,尽管令人惊讶的是,我仍然无法在文档中找到任何明确的指示。const T
Reference
因此,常量范围可以声明为:
template<class C>
using ConstRange = boost::any_range<C, boost::forward_traversal_tag, const C, std::ptrdiff_t>
评论
Range<const T>
并且是两件截然不同的事情。第一个 () 是常数 的 。第二个 () 是非常数的常数。例如,这与以下两者的区别相同 和。const Range<T>
Range<const T>
Range
T
const Range<T>
Range
T
std::vector<const int>
const std::vector<int>
const Range<T>
Range<const T>
const
const_iterator
iterator
range_iterator
Range
const_iterators
void f(const Range<T>)
不会按照你的想法去做。请参阅顶级 const 不影响函数签名。const Range<T>
Range
const
const
std::vector<const X>