2017-05-30 7 views
6

Boost.Rangeのドキュメント(および実装)は、const refsを引数とする突然変異アルゴリズムのオーバーロードを示します。例えばBoost.Range's Sort documentationについて示しています突然変異Boost.Rangeアルゴリズムのconstオーバーロードがあるのはなぜですか?

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-referenceは大歓迎ですが、Boost.Rangeでのサポートはあまりにも侵略的でRange.V3の採用には遅れていることは理解しています(それがBoostの一部であったといいでしょう)。

+0

コンテナの状態は変更できませんが、基になる要素は変更可能であるという意味では 'const'のコンテナのように見えます。 – NathanOliver

+3

' const iterator_pair 'はconst範囲ですが、しかし、それは宛先要素をソートすることができないことを意味しません... – ildjarn

答えて

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の範囲にあるわけではありません。

+0

具体例のおかげで。しかし、それは本当にそのような容器を持つことは理にかなっていますか?それでは、それを 'const'と宣言して得たものは何ですか? – akim

+4

@akimこれはコンテナではありません。それは範囲のビューです。 'スパン'は無駄に便利です。生のC配列やバッファポインタを使うのと同じように、 'span'は現代のC++のものをアップグレードします。これにより、バッファをコピーしたり、バッファがどのくらい割り当てられているかを気にせずに、バッファ内の範囲を渡すことができます。それはあなたに統語的な砂糖がたくさんあるベアメタルのパフォーマンスを与えます。 constのポインタとconstへのポインタがどのように異なっているかのように、その値は範囲の内容ではなく、問題の範囲のスパンであるだけなので、 'const'です。スパンのコピーは、ポインタのような要素をコピーしません。 – Yakk

関連する問題