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

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

4

1 回答 1

5

在您的第一个示例中,s.substr(1,s.size()-2)返回一个临时对象,其生命周期在表达式末尾到期。但是,boost::tokenizer有一个接受 const 引用的构造函数,这意味着只要该引用存在,对象的生命周期就会延长。问题是boost::tokenizer只将迭代器存储到传入的引用,所以对对象的引用过期并且迭代器现在无效。

于 2012-08-19T23:30:24.517 回答