为什么有变异 Boost.Range 算法的 const 重载?
Why are there const overloads of mutating Boost.Range algorithms?
Boost.Range 的文档(和实现)显示了以常量引用作为参数的变异算法的重载。例如 Boost.Range's Sort documentation 显示:
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&
使这一点有点没有实际意义。右值引用将是最受欢迎的,但我的理解是他们在 Boost.Range 中的支持过于具有侵入性,并且 "deferred" 对 Range.V3 的采用(如果同时它是一部分就好了提升)。
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
从范围传播到范围中的元素。
Boost.Range 的文档(和实现)显示了以常量引用作为参数的变异算法的重载。例如 Boost.Range's Sort documentation 显示:
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&
使这一点有点没有实际意义。右值引用将是最受欢迎的,但我的理解是他们在 Boost.Range 中的支持过于具有侵入性,并且 "deferred" 对 Range.V3 的采用(如果同时它是一部分就好了提升)。
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
从范围传播到范围中的元素。