成员初始值设定项列表符号:方括号与括号

Geo*_*rge 5 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
};
Run Code Online (Sandbox Code Playgroud)

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

问题:为什么他在这里使用方括号(即{..})来编写这两个初始化程序语句?我在网络上的其他地方看到过人们用括号括起初始化列表,这样(AFAIK)也可以合法地阅读elem(new double[s])sz(s)。那么这两种表示法在语义上有区别吗?还有其他方法可以初始化这些变量(在初始化列表的上下文中)吗?

Pet*_*ter 6

表格

Vector(int s) :elem(new double[s]), sz(s) { }
Run Code Online (Sandbox Code Playgroud)

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

Vector(int s) :elem{new double[s]}, sz{s} { }
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 当然是有区别的。后者首先使用 std::initializer_list 进行初始化,然后由构造函数接收。因此,当有 2 个参数时,您可能会得到不同的结果,例如使用 `std::vector`:例如 {1, 2} 的行为与 (1, 2) 不同。 (4认同)