gpt4 book ai didi

c++ - boost::spirit::qi::phrase_parse 某处的未定义行为

转载 作者:行者123 更新时间:2023-11-30 04:00:14 25 4
gpt4 key购买 nike

我正在学习使用 boost::spirit 库。我拿这个例子http://www.boost.org/doc/libs/1_56_0/libs/spirit/example/qi/num_list1.cpp并在我的电脑上编译它 - 它工作正常。

但是如果我稍微修改一下——如果我初始化解析器本身

auto parser = qi::double_ >> *(',' >> qi::double_);

某处作为全局变量并将其传递给 phrase_parse,一切都变得疯狂。这是完整的修改代码(仅修改 1 行并添加 1 行)- http://pastebin.com/5rWS3pMt

如果我运行原始代码并将“3.14、3.15”传递给标准输入,它会说解析成功,但在我修改后的版本中它会失败。我尝试了很多相同类型的修改 - 将解析器分配给全局变量 - 在某些编译器的某些变体中它会出现段错误。

我不明白为什么会这样,怎么会这样。这是另一个更简单的版本,它打印 true,然后在 clang++ 上打印段错误,在 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;
}

最佳答案

您不能使用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-0x lib 版本(由 Eric Niebler 编写),它 promise 通过完全重新设计以了解引用来解决这些问题。我认为这需要一些 Boost Proto 当前无法使用的 c++11 功能。

关于c++ - boost::spirit::qi::phrase_parse 某处的未定义行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26410498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com