6

Boost.Range 的文档(和实现)显示了以 const refs 作为参数的变异算法的重载。例如Boost.Range 的 Sort 文档显示:

template<class RandomAccessRange>
RandomAccessRange& sort(RandomAccessRange& rng);

template<class RandomAccessRange>
const RandomAccessRange& sort(const RandomAccessRange& rng);

template<class RandomAccessRange, class BinaryPredicate>
RandomAccessRange& sort(RandomAccessRange& rng, BinaryPredicate pred);

template<class RandomAccessRange, class BinaryPredicate>
const RandomAccessRange& sort(const RandomAccessRange& rng, BinaryPredicate pred);

重载 2 和 4 的意义何在?当然,能够通过临时工是件好事,但随后const&使这一点变得毫无意义。Rvalue-references 将是最受欢迎的,但我的理解是它们对 Boost.Range 的支持过于侵入性,并且“推迟”到 Range.V3 的采用(如果同时它是 Boost 的一部分,那就太好了)。

4

1 回答 1

6
template<class T>
struct span_t {
  T* b =0;
  T* e =0;
  T* begin() const { return b; }
  T* end() const { return e; }
  std::size_t size() const { return end()-begin(); }
  bool empty() const { return size()==0; }
  T& operator[](std::size_t i) const { return b[i]; }
  span_t()=default;
  span_t(span_t const&)=default;
  span_t& operator=(span_t const&)=default;
  span_t( T* s, T* f ):b(s),e(f) {}
  span_t( T* s, std::size_t l):span_t(s, s+l) {}
};

这是一个(实用且有用的)随机访问范围。

它的所有方法(除了operator=)都是const. 你可以排序。

并非所有范围都从范围传播const到范围中的元素。

于 2017-05-30T14:54:32.540 回答