3

なぜ boost::find_first は、その入力への非定数参照を取るのですか?のコメント 「反復オブジェクトに十分な寿命があることを「証明」するために、呼び出し元が const_iterator テンプレートパラメーターを使用して非 const iterator_range を作成する」ことを提案します。

これは何を意味し、どのようにすればよいですか?

特に、このコードで const-correctness を達成するにはどうすればよいですか?

typedef std::map<int, double> tMyMap;
tMyMap::const_iterator subrange_begin = my_map.lower_bound(123);
tMyMap::const_iterator subrange_end = my_map.upper_bound(456);

// I'd like to return a subrange that can't modify my_map
// but this vomits template errors complaining about const_iterators
return boost::iterator_range<tMyMap::const_iterator>(subrange_begin, subrange_end);  
4

1 に答える 1

2

範囲への非定数参照を持つと、一時変数へのバインドが回避されます¹

コンパイラに作業を任せることで、難問²を回避できます。

tMyMap const& my_map; // NOTE const
// ...

return boost::make_iterator_range(my_map.lower_bound(123), mymap.upper_bound(456));

¹ 標準 C++ は、const-reference 変数にバインドされた一時変数の有効期間を延長しますが、これはオブジェクト メンバーにバインドされた参照には適用されません。したがって、範囲を参照によって集計すると、この間違いが非常に起こりやすくなります。

/OT: 一部のブースト範囲機能 (アダプターなど) の予防措置/チェックを行っても、IMOは安全に使用できないことがよくあります。私は認めたくないほど頻繁にそれらの罠に陥りました。

² 提供されたサンプルから再現できないという事実は別として

于 2016-04-02T08:23:58.083 に答える