两个相同的程序使用Boost :: tokenizer,但有两个不同的输出

时间:2012-08-19 22:43:36

标签: c++ boost

以下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;
}

它正常工作!这怎么可能 ?乍一看,我认为这两个版本是相同的......

1 个答案:

答案 0 :(得分:4)

在第一个示例中,s.substr(1,s.size()-2)返回临时对象,其生命周期在表达式结尾处到期。但是,boost::tokenizer有一个构造函数,它接受一个const引用,这意味着只要该引用存在,对象的生命周期现在将被扩展。问题是boost::tokenizer只将迭代器存储到传入的引用中,因此对对象的引用到期,迭代器现在无效。