2

次の C++ プログラム

#include <iostream>
#include <boost/tokenizer.hpp>
using namespace std;
int main()
{
    typedef boost::tokenizer<boost::char_separator<char> > tokenizer;

    string s ("(0,30,0)");

    tokenizer tokens(s.substr(1,s.size()-2), boost::char_separator<char>(","));
    for (tokenizer::iterator tok_iter = tokens.begin(); tok_iter != tokens.end(); ++tok_iter)
        cout<<*tok_iter<<endl;

    return 0;
}

...0 0 0の代わりに出力するため、問題があります0 30 0

しかし、そのように少し変更すると:

#include <iostream>
#include <boost/tokenizer.hpp>
using namespace std;
int main()
{
    typedef boost::tokenizer<boost::char_separator<char> > tokenizer;

    string s ("(0,30,0)");

    //Modified lines:
    string t (s.substr(1,s.size()-2));
    tokenizer tokens(t, boost::char_separator<char>(","));

    for (tokenizer::iterator tok_iter = tokens.begin(); tok_iter != tokens.end(); ++tok_iter)
        cout<<*tok_iter<<endl;

    return 0;
}

それは正しく動作します!これはどのように可能ですか?一見すると、2つのバージョンは同じだと思います...

4

1 に答える 1

5

最初の例では、一時オブジェクトs.substr(1,s.size()-2)を返し、その有効期間は式の最後で期限切れになります。ただし、const 参照を取るコンストラクターがあります。つまり、その参照が存在する限り、オブジェクトの有効期間が延長されます。問題は、渡された参照への反復子のみを格納するため、オブジェクトへの参照が期限切れになり、反復子が無効になることです。boost::tokenizerboost::tokenizer

于 2012-08-19T23:30:24.517 に答える