语义动作似乎破坏了属性兼容性

时间:2016-11-09 10:00:03

标签: c++ boost-spirit-x3

似乎添加语义操作可能会破坏属性兼容性。 以下简单示例按预期工作和编译:

auto pair_rule = x3::rule<class·pair_rule, std::pair<std::string, std::string>>()
    = x3::alnum >> '=' >> x3::alnum;
auto combined = pair_rule | x3::alnum;

现在,当我向pair_rule中的combined添加语义操作时:

auto action = [&](auto& ctx) {}; 
auto pair_rule = x3::rule<class pair_rule, std::pair<std::string, std::string>>()
    = x3::alnum >> '=' >> x3::alnum;
auto combined = pair_rule[action] | x3::alnum;

编译器抱怨移动不兼容的类型

boost_1_62_0/boost/spirit/home/x3/support/traits/move_to.hpp:62:18: note:   mismatched types ‘const std::pair<_T1, _T2>’ and ‘std::remove_reference<const char&>::type {aka const char}’
         dest = std::move(src);

但是,当在alnum中向pair_rule解析器之一添加另一个语义操作时,代码会再次编译:

auto action = [&](auto& ctx) {}; 
auto pair_rule = x3::rule<class pair_rule, std::pair<std::string, std::string>>()
    = x3::alnum >> '=' >> x3::alnum[action];
auto combined = pair_rule[action] | x3::alnum;

为什么语义动作会破坏属性兼容性,以及额外的语义动作如何修复&#34;它?

0 个答案:

没有答案