成员初始化列表表示法:括号与括号

时间:2016-03-25 01:47:45

标签: c++ initialization initializer-list

请考虑以下来自pg的代码片段。 17的 C ++之旅

class Vector {
public:
  Vector(int s) :elem{new double[s]}, sz{s} { } //construct a Vector
  double& operator[](int i) { return elem[i]; } //element access: subscripting
  int size() { return sz; }
private:
  double* elem; // pointer to the elements
  int sz;  // the number of elements
};

这里我关注第三行的成员初始化列表,其中Stroustrup将冒号与两个初始化语句elem{new double[s]}sz{s}分开。

问题:为什么在这里使用括号(即{..})来生成这两个初始化语句?我已经在网络上的其他地方看到人们用括号创建初始化列表,这样这也可以(AFAIK)合法地阅读elem(new double[s])sz(s)。那么这两个符号之间是否存在语义差异?有没有其他方法可以初始化这些变量(在初始化列表的上下文中)?

1 个答案:

答案 0 :(得分:3)

表格

Vector(int s) :elem(new double[s]), sz(s) { }

在所有版本的C ++中都是正确的。有花括号的那个,比如

Vector(int s) :elem{new double[s]}, sz{s} { }

于2011年被引入C ++标准,在旧标准中无效。

在您询问的上下文中,没有区别。但是,还有其他语言和库功能,也引入了2011标准,依赖于第二种形式而不能与第一种形式一起使用。

在构造函数的初始化列表中没有其他方法来初始化base的成员。可以分配给构造函数体中的成员,但这不是初始化语法。