两个相同的程序使用Boost::标记化器,但有两个不同的输出

Two same programs using Boost::tokenizer, but two different outputs

本文关键字:两个 输出 程序 Boost      更新时间:2023-10-16

下面的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;
}

由于它输出CCD_ 1而不是CCD_。。。

但如果我稍微改变一下:

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

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

在第一个示例中,s.substr(1,s.size()-2)返回一个临时对象,其生存期在表达式结束时到期。然而,boost::tokenizer有一个接受常量引用的构造函数,这意味着只要引用存在,对象的生存期就会延长。问题是boost::tokenizer只存储对传入引用的迭代器,因此对对象的引用过期,迭代器现在无效。