理解模板的构造函数初始值设定项的解析
Understanding parsing of constructor initializer for template
我正在努力理解 a program demonstrating boost/spirit。
在以下模板定义中:
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)
的含义。
- 我假设它是 constructor initializer。
- 此外,我假设它是 member initializer list 并且
- 成员初始化器
roman::base_type(start)
初始化了一个名为 base_type
的 roman
基类
- 实际上是
grammar<Iterator, T1, T2, T3, T4>
的 typedef
,roman
继承自 grammar<Iterator, T1, T2, T3, T4>
。
我不明白的是,当 start
是 roman
的成员时,如何用 start
初始化它,派生的 class 我们仍在构建?
来自文档中围绕示例的叙述:
- initialize the base grammar class by giving it the start rule (its the first rule that gets called when the grammar starts parsing)
来源:http://www.boost.org/doc/libs/1_60_0/libs/spirit/doc/html/spirit/qi/tutorials/roman_numerals.html
它正在传递对成员的引用。尽管此时尚未构造该成员,但对其的引用是有效的。如果基础 class 不取消引用引用(即只存储它或获取它的地址)那么代码是合法的......如果有点 'dangerous'.
我正在努力理解 a program demonstrating boost/spirit。
在以下模板定义中:
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)
的含义。
- 我假设它是 constructor initializer。
- 此外,我假设它是 member initializer list 并且
- 成员初始化器
roman::base_type(start)
初始化了一个名为base_type
的 - 实际上是
grammar<Iterator, T1, T2, T3, T4>
的typedef
,roman
继承自grammar<Iterator, T1, T2, T3, T4>
。
roman
基类 - 成员初始化器
我不明白的是,当 start
是 roman
的成员时,如何用 start
初始化它,派生的 class 我们仍在构建?
来自文档中围绕示例的叙述:
- initialize the base grammar class by giving it the start rule (its the first rule that gets called when the grammar starts parsing)
来源:http://www.boost.org/doc/libs/1_60_0/libs/spirit/doc/html/spirit/qi/tutorials/roman_numerals.html
它正在传递对成员的引用。尽管此时尚未构造该成员,但对其的引用是有效的。如果基础 class 不取消引用引用(即只存储它或获取它的地址)那么代码是合法的......如果有点 'dangerous'.