【问题标题】:Proper way of declaring `const` `boost::range`s声明`const``boost::range`s的正确方法
【发布时间】: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::&lt;const T&gt;::typeconst_iterator(如果底层容器有这样的成员类型),而不是iterator,所以不能通过这个迭代器修改容器。

这是否意味着Range&lt;const T&gt; 也使用const_iterators 来遍历范围?

【问题讨论】:

  • Range&lt;const T&gt;const Range&lt;T&gt; 是两个非常不同的东西。第一个 (Range&lt;const T&gt;) 是常量 TRange。第二个 (const Range&lt;T&gt;) 是常量 Range 和非常量 T。例如,这是相同的区别。 std::vector&lt;const int&gt;const std::vector&lt;int&gt;.
  • @Someprogrammerdude 除了const Range&lt;T&gt; 可能仍然能够修改底层容器,而Range&lt;const T&gt; 可能会推导出const 的特性(即使用const_iterators 而不是iterator s) 来自range_iterator 元函数。那么,究竟什么是常量Range?一个使用const_iterators 还是一个“包装”成员不变(但底层容器可能)?
  • void f(const Range&lt;T&gt;) 不会按照你的想法去做。见Top-level const doesn't influence a function signature
  • @Oktalist 是的,但这不是重点。我在问const Range&lt;T&gt; 是否可以修改底层容器;我不是在问如何根据Range objectconstness 重载函数——原则上它可以独立于底层容器的constness。该函数只是一个示例。我会澄清的。
  • @Someprogrammerdude:不过,您实际上无法创建std::vector&lt;const X&gt;

标签: c++ boost constants boost-range


【解决方案1】:

显然,确保值不被修改的正确方法不是我提到的那些。

Boost.Range's documentation可以看出any_range采用以下模板参数:

template<
    class Value
  , class Traversal
  , class Reference
  , class Difference
  , class Buffer = any_iterator_default_buffer
>
class any_range;

我强烈怀疑声明“常量范围”的方法是将const T 指定为Reference 类型模板参数,尽管令人惊讶的是,我仍然无法在文档中找到任何明确的指示就是这样。

所以一个 const 范围可以声明为:

template<class C>
using ConstRange = boost::any_range<C, boost::forward_traversal_tag, const C, std::ptrdiff_t>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多