首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用升华精神表达

用升华精神表达
EN

Stack Overflow用户
提问于 2021-10-04 14:28:47
回答 1查看 159关注 0票数 1

我对boost精神有一个问题,expression.The的原始代码更复杂,我给它做了一个小快照。此代码在调试模式下按预期工作,不发布,解析返回false,但应该返回true (我正在VisualStudio2019上测试它)

代码语言:javascript
复制
int main() {
    namespace qi = boost::spirit::qi;

    auto X19 = qi::lit("                   ") | qi::lit(" 0.000000000000D+00");
    auto i4 = qi::uint_;
    string str = "1234                   1234";
    auto f = str.cbegin();
    auto l = str.cend();
    bool ret = qi::parse(f, l, ( i4 >> X19 >> i4 ));
}

下一次快照在两种模式下都运行良好:

代码语言:javascript
复制
int main() {
    namespace qi = boost::spirit::qi;

    auto i4 = qi::uint_;
    string str = "1234                   1234";
    auto f = str.cbegin();
    auto l = str.cend();
    bool ret = qi::parse(f, l, ( i4 >> (qi::lit("                   ") | qi::lit(" 0.000000000000D+00")) >> i4 ));
    cout << ret << endl;
    return ret;
}

我做错了什么,用这种方式划分长表情?谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-04 14:56:12

你不由自主地跑进了悬挂的临时陷阱,用圣灵的Proto表情。简短的规则是:

不要在精灵表达式中使用auto

您的程序展示了未定义行为:请参阅在编译器资源管理器上直播

解决方案涉及BOOST_SPIRIT_AUTOqi::copy (在最近发布的boost版本之前,它们以前只作为boost::proto::deep_copy使用)。

固定

住在Coliru

代码语言:javascript
复制
#include <boost/spirit/include/qi.hpp>

int main() {
    namespace qi = boost::spirit::qi;

    auto i4 = qi::copy(qi::uint_);
    auto X19 = qi::copy(               //
          qi::lit("                   ") //
        | qi::lit(" 0.000000000000D+00")//
        );

    std::string str = "1234                   1234";
    auto        f = str.cbegin(), l = str.cend();

    bool ret = qi::parse(f, l, (i4 >> X19 >> i4));
    std::cout << std::boolalpha << ret << "\n";
}

打印

代码语言:javascript
复制
true

奖金

  1. 注意精神X3不再有这个限制/问题:住在Coliru #包括 int (){命名空间x3 =boost::spirit:X3;auto i4= x3::uint_;auto X19 = // x3:lit(“") /x3:lit(”0.000000000000D+00") //;std::string str = "1234 1234";auto f= str.cbegin(),l= str.cend();bool ret = parse(f,l,(i4 >> X19 >> i4));std:cout << std::boolalpha << ret << "\n";
  2. 你可能真的想 qi::uint_parser i4;/或x3::uint_parser i4;
  3. 它看起来很像解析COBOL (固定宽度)记录,在这种情况下,我认为有更好的方法来组织您的语法,以使它可靠。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69437727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档