了解模板的构造函数初始值设定项的分析

Understanding parsing of constructor initializer for template

本文关键字:构造函数 了解      更新时间:2023-10-16

我试图理解一个展示提升/精神的程序。

在以下模板定义中:

template <typename Iterator>
struct roman : qi::grammar<Iterator,unsigned()> {
    roman() : roman::base_type(start)
    {
        using qi::eps;
        using qi::lit;
        using qi::_val;
        using qi::_1;
        using ascii::char_;
        start = eps[_val = 0] >>
            (
                +lit('M')[_val += 1000]
                ||  hundreds[_val += _1]
                ||  tens[_val += _1]
                ||  ones[_val += _1]
                )
            ;
    }
    qi::rule<Iterator,unsigned()> start;
};

我试图理解: roman::base_type(start)的含义.

  • 我假设它是一个构造函数初始值设定项。
  • 此外,我假设它是一个成员初始值设定项列表,并且
    • 成员初始值设定项roman::base_type(start)初始化名为base_typeroman
    • 这实际上是roman继承的grammar<Iterator, T1, T2, T3, T4> typedef

我不明白的是,当start是我们仍在构建的派生类roman的成员时,如何使用start初始化它?

从文档中围绕示例的叙述来看:

  1. 通过为基本语法类提供开始规则来初始化它(这是语法开始解析时调用的第一个规则(

来源: http://www.boost.org/doc/libs/1_60_0/libs/spirit/doc/html/spirit/qi/tutorials/roman_numerals.html

它传递对成员的引用。尽管此时尚未构造该成员,但对它的引用是有效的。如果基类不取消引用引用(即只存储它或获取它的地址(,那么代码是合法的......如果有点"危险"。