Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Boost::tokenizer的两个相同程序,但有两个不同的输出 以下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; }_C++_Boost - Fatal编程技术网

使用Boost::tokenizer的两个相同程序,但有两个不同的输出 以下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; }

使用Boost::tokenizer的两个相同程序,但有两个不同的输出 以下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; },c++,boost,C++,Boost,它工作正常!这怎么可能?乍一看,我认为这两个版本是相同的…在您的第一个示例中,s.substr(1,s.size()-2)返回一个临时对象,其生存期在表达式结束时到期。但是,boost::tokenizer有一个接受常量引用的构造函数,这意味着只要该引用存在,对象的生存期就会延长。问题是,boost::tokenizer只存储传入引用的迭代器,因此对对象的引用过期,迭代器现在无效。我想知道为什么boost::tokenizer类没有(并初始化)const string&数据成员,仅仅是为了延长过

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

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

我想知道为什么boost::tokenizer类没有(并初始化)const string&数据成员,仅仅是为了延长过去的临时工的寿命,就像在这种情况下一样?@DanNissenbaum:那会产生一个悬而未决的引用。一旦构造函数的
常量字符串&
过期,数据成员将引用过期的内存。确保字符串有效的唯一方法是将字符串复制到可能影响性能的数据成员中。
#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;
}