了解模板的构造函数初始值设定项的分析
Understanding parsing of constructor initializer for template
我试图理解一个展示提升/精神的程序。
在以下模板定义中:
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_type
的roman
基 - 这实际上是
roman
继承的grammar<Iterator, T1, T2, T3, T4>
typedef
。
- 成员初始值设定项
我不明白的是,当start
是我们仍在构建的派生类roman
的成员时,如何使用start
初始化它?
从文档中围绕示例的叙述来看:
- 通过为基本语法类提供开始规则来初始化它(这是语法开始解析时调用的第一个规则(
来源: http://www.boost.org/doc/libs/1_60_0/libs/spirit/doc/html/spirit/qi/tutorials/roman_numerals.html
它传递对成员的引用。尽管此时尚未构造该成员,但对它的引用是有效的。如果基类不取消引用引用(即只存储它或获取它的地址(,那么代码是合法的......如果有点"危险"。
相关文章:
- 了解构造函数在移动、复制、赋值语义中的行为
- 构造函数是否有一种现代C++方法来了解其'container'类?
- 了解类构造函数的静态强制转换
- 了解复制构造函数和引用
- 了解类构造函数中的"内联"C++?
- 了解共享_ptr混叠构造函数的原型
- 了解调用哪个构造函数
- 了解构造函数的一些特定案例
- 了解构造函数初始值设定项列表中带有大括号的奇怪语法
- 了解线程构造函数的基础知识
- 了解C 中的构造函数
- 了解移动构造函数、std::move 和析构函数
- 了解复制构造函数和复制赋值运算符
- C++11使variadic构造函数了解一个初始化列表的初始化列表
- 了解模板的构造函数初始值设定项的分析
- 复制构造函数 - 了解问题
- 了解复制构造函数
- 了解默认移动构造函数定义
- 了解Lambda闭包类型如何删除默认构造函数
- 了解虚拟基类和构造函数调用