2014-02-25 23 views
6

灵魂分析器是否不适用于auto? - 4.8和VC13将分析器分配给自动变量

#include <cstdio> 
#include <string> 
#include <boost/spirit/include/qi.hpp> 

using namespace std; 

namespace qi = boost::spirit::qi; 

int main() 
{ 
    string line = "[z]"; 

    auto bracketed_z = '[' >> +qi::char_('z') >> ']'; 

    auto p = line.cbegin(); 
    printf("%d", qi::parse(p, line.cend(), '[' >> +qi::char_('z') >> ']')); // Works 

    p = line.cbegin(); 
    printf("%d", qi::parse(p, line.cend(), bracketed_z));     // Crashes 
} 

Reproes与克++:如果经由auto变量传递传递给qi::parse()直列当

一个简单的解析器工作正常,但与崩溃段错误。

更新:原始代码中的错误被修复(p在第二次调用parse()之前未被重新初始化)。

+0

任何C++解析器如何处理'auto'?解析器旨在读取运行时确定的特定类型,在编译时解析“auto”类型。所以恕我直言,除非'自动'产生'boost :: variant'或'boost :: any'这是不可能的。 –

+1

请注意,第一个迭代器通过引用传递(IIRC)。也就是说,在第一次调用'qi :: parse'后,'p'已经改变了。 – dyp

+0

谢谢@dyp。修复了错误。 – mstone

回答

9

精神解析器不是设计成与精神V2 auto使用。

这是因为底层Proto表达式模板持有对临时对象的引用。

您可以使用

  • qi::copy()(在后备箱现有boost_1_55_0后,没有在这个时候任何发布的版本)
  • boost::proto::deep_copy
  • 或BOOST_SPIRIT_AUTO(首先创造here

我在SO上更经常地写下这些东西:https://stackoverflow.com/search?q=user%3A85371+deep_copy,具体来说,这个:

升压精神X3不会有此限制。

+1

最近经常遇到错误。因此,需要有当代版本的Boost.Spirit Qi库,它必须完全启用C++ 11/C++ 1y(我认为它应该至少包含对移动语义的支持)。 – Orient

+2

@Dukales这似乎是需要引用的意见:)如果你的意思是你很想看到Spirit X3,+1 – sehe

3

Boost.Spirit使用表达式模板并且不适用于auto。一种解决方法是使用boost::proto::deep_copy

auto bracketed_z = proto::deep_copy('[' >> +qi::char_('z') >> ']');