5

Boost のfind_firstアルゴリズムは C のアルゴリズムを強化したものですstrstr()が、干し草の山 (検索空間) がconst 以外の参照として渡されるのはなぜですか? 一致する範囲は別iterator_rangeのオブジェクトで返されるため、参照による出力の問題ではありません。

make_iterator_rangeによって作成された一時的な範囲での呼び出しを防ぎます。

const std::string str("haystack");
const std::string findstr("stack");

boost::sub_range<const std::string> match = boost::algorithm::find_first(
        boost::make_iterator_range(str),
        boost::make_iterator_range(findstr));

代わりに、ソース範囲を表すローカル変数を明示的に作成する必要があります。

const std::string str("haystack");
const std::string findstr("stack");

boost::sub_range<const std::string> haystack = boost::make_iterator_range(str);

boost::sub_range<const std::string> match = boost::algorithm::find_first(
        haystack,
        boost::make_iterator_range(findstr));

(これは、boost/algorithm/string/find.hppの他の関数、つまりfind, ifind_first, find_last, ifind_last, find_nth, &ifind_nthfind_headも同様に適用されます)。find_tailfind_token

4

1 に答える 1

11

を呼び出した後も、返された範囲が引き続き有効であることを確認するためですfind_first

上記の最初のケースは問題ありませんが、次の場合match、破壊された一時的な文字列を指す結果になります。

boost::sub_range<const std::string> match = boost::algorithm::find_first(
        boost::make_iterator_range(std::string("haystack"),
        boost::make_iterator_range(std::string("stack"));

干し草の山が非定数であるという要件は、一時オブジェクト(右辺値)へのバインドを防ぎます。一時オブジェクトは、戻り時に破棄され、イテレータfind_firstを無効にします。match

于 2012-11-21T19:01:32.157 に答える