C++ Spirit X3与boost::string_ref语义动作构造

C++ Spirit X3与boost::string_ref语义动作构造,c++,boost,boost-spirit-x3,C++,Boost,Boost Spirit X3,我对boost Spirit X3和string_ref类感到困惑。如何构造字符串\u ref对象。控制台打印的内容如下所示: N5boost16basic_string_refIcSt11char_traitsIcEEE / N5boost14iterator_rangeIN9__gnu_cxx17__normal_iteratorIPcNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEE 我不知道如何将其转换为“普通类型名称”,但

我对boost Spirit X3和string_ref类感到困惑。如何构造字符串\u ref对象。控制台打印的内容如下所示:

N5boost16basic_string_refIcSt11char_traitsIcEEE / N5boost14iterator_rangeIN9__gnu_cxx17__normal_iteratorIPcNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEE
我不知道如何将其转换为“普通类型名称”,但在我看来,我需要从boost迭代器范围创建字符串\u ref

 auto f = [](auto& ctx)
    { 
        auto val  = _val(ctx);
        auto attr = _attr(ctx);

        std::cout << typeid(val).name() << " / " << typeid(attr).name() << "\n";
        // _val(ctx) = boost::string_ref( attr.c_str(), 1 ); //phx::construct<boost::string_ref>( _where(ctx).begin(), _attr(ctx).size() );
     };
auto f=[](auto&ctx)
{ 
自动值=_值(ctx);
自动属性=_属性(ctx);
标准::cout lit(“”);

cv_和_he
的评论之后,我使用以下lambda作为语义动作

auto f = [](auto& ctx)
{ 
    auto& attr = _attr(ctx);
    _val(ctx) = boost::string_ref( &attr[0], attr.size() );
};

。从
迭代器范围
创建
string\u ref
时要小心。
string\u ref
要求字符是连续的,而
迭代器范围
则不要求字符是连续的。你必须自己确保这一点。不太确定这是否有意义。毕竟,现在,在99%的ca中,你有一个对临时字符串或向量的悬挂引用塞斯。
auto f = [](auto& ctx)
{ 
    auto& attr = _attr(ctx);
    _val(ctx) = boost::string_ref( &attr[0], attr.size() );
};