以下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;
}
它正常工作!这怎么可能 ?乍一看,我认为这两个版本是相同的......
答案 0 :(得分:4)
在第一个示例中,s.substr(1,s.size()-2)
返回临时对象,其生命周期在表达式结尾处到期。但是,boost::tokenizer
有一个构造函数,它接受一个const引用,这意味着只要该引用存在,对象的生命周期现在将被扩展。问题是boost::tokenizer
只将迭代器存储到传入的引用中,因此对对象的引用到期,迭代器现在无效。