我正在学习如何使用boost::灵体库。我以这个例子list1.cpp为例,并在我的计算机上编译它--它工作得很好。
但是,如果我稍微修改它-如果我初始化解析器本身
auto parser = qi::double_ >> *(',' >> qi::double_);
作为全局变量,并将其传递给phrase_parse,一切都会变得疯狂。以下是完整的修改代码(只修改了1行,添加了1行)- http://pastebin.com/5rWS3pMt
如果我运行原始代码并将"3.14,3.15“传递给stdin,它会说解析成功,但是修改后的版本失败了。我尝试了许多相同类型的修改--将解析器分配给全局变量--在一些编译器上的一些变体中,它是分段错误。
我不明白为什么和怎么会这样。下面是另一个简单的版本,它在clang++上打印true,然后在g++上打印分段错误,在g++上只打印分段错误
#include <boost/spirit/include/qi.hpp>
#include <iostream>
#include <string>
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
const auto doubles_parser_global = qi::double_ >> *(',' >> qi::double_);
int main() {
const auto doubles_parser_local = qi::double_ >> *(',' >> qi::double_);
const std::string nums {"3.14, 3.15, 3.1415926"};
std::cout << std::boolalpha;
std::cout
<< qi::phrase_parse(
nums.cbegin(), nums.cend(), doubles_parser_local, ascii::space
)
<< std::endl; // works fine
std::cout
<< qi::phrase_parse(
nums.cbegin(), nums.cend(), doubles_parser_global, ascii::space
) // this segfaults
<< std::endl;
}
发布于 2014-10-16 10:19:01
不能使用auto
存储解析器表达式。
您需要直接从临时表达式中计算值,或者需要分配给规则/语法:
const qi::rule<std::string::const_iterator, qi::space_type> doubles_parser_local = qi::double_ >> *(',' >> qi::double_);
您可以在最新的BOost版本(可能是dev分支)上吃蛋糕,应该有一个BOOST_SPIRIT_AUTO宏。
这正在成为一个常见问题项目:
我认为这实际上是对底层Proto库的限制。github上有一个Proto-0xlib版本(由Eric编写),它承诺通过完全重新设计引用来解决这些问题。我认为这需要一些Boost Proto目前无法使用的c++11特性。
https://stackoverflow.com/questions/26410498
复制相似问题