2

私はこのコードを持っています:

#include <boost/tokenizer.hpp>

typedef boost::tokenizer<boost::char_separator<char> > tokenizer;

int main() {
    using namespace std;
    boost::char_separator<char> sep(",");

    string s1 = "hello, world";
    tokenizer tok1(s1, sep);
    for (auto& token : tok1) {
        cout << token << " ";
    }
    cout << endl;

    tokenizer tok2(string("hello, world"), sep);
    for (auto& token : tok2) {
        cout << token << " ";
    }
    cout << endl;

    tokenizer tok3(string("hello, world, !!"), sep);
    for (auto& token : tok3) {
        cout << token << " ";
    }
    cout << endl;

    return 0;
}

このコードは、次の結果を生成します。

hello  world 
hello  
hello  world  !!

明らかに、2行目は間違っています。hello world代わりに期待していた。何が問題ですか?

4

1 に答える 1

5

トークナイザーは、コンストラクターに最初の引数として渡された文字列のコピーを作成したり、構築時にすべてのトークンを計算してキャッシュしたりしません。トークンの抽出は、オンデマンドで怠惰な方法で実行されます。

ただし、それを可能にするためには、トークンの抽出が実行されるオブジェクトは、トークンが抽出されている限り存続する必要があります。

ここで、 の初期化が終了すると、トークンを抽出するオブジェクトは範囲外になりtok2ます ( も同様tok3)。これは、トークナイザー オブジェクトがその文字列に反復子を使用しようとすると、未定義の動作が発生することを意味します。

tok3これは、純粋に偶然に期待される出力を提供していることに注意してください。期待される出力は、実際には、動作が定義されていないプログラムの可能な出力の 1 つです。

于 2013-06-09T16:51:44.807 に答える