[英]Member initializer list notation: curly braces vs parentheses
考虑以下来自 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)
。 那么这两种表示法之间是否存在语义差异? 有没有其他方法可以初始化这些变量(在初始化列表的上下文中)?
表格
Vector(int s) :elem(new double[s]), sz(s) { }
在所有版本的 C++ 中都是正确的。 带花括号的那个,比如
Vector(int s) :elem{new double[s]}, sz{s} { }
于 2011 年引入 C++ 标准,在旧标准中无效。
在您询问的上下文中,没有区别。 但是,2011 标准中也引入了其他语言和库功能,它们依赖于第二种形式并且不适用于第一种形式。
没有其他方法可以在构造函数的初始化列表中初始化基类成员。 可以分配给构造函数体中的成员,但这不是初始化语法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.