我应该在构造函数初始化列表中使用列表初始化吗?

Should I use list initialization in a constructor initializer list?

本文关键字:初始化 列表 我应该 构造函数      更新时间:2023-10-16

在gotw# 6b第2部分中,我们找到了代码

class polygon {
public:
    polygon() : area{-1} {}
    //....
    double area;
};

为什么我们应该使用列表初始化基类型,而不是常用的area(-1) ?他们的行为是否有不同的优势/情况?

为什么我们要用列表初始化基类型,而不是常用的区域(-1)?

首先,我认为这里的信息只是c++ 11的统一初始化应该在可以使用的时候使用。在这种情况下,这主要是风格和品味的问题。

作者所倡导的风格和品味是否会成为事实上的标准,目前还很难说。我们都知道统一初始化毕竟不是那个统一的。另一方面,在大多数情况下,采用它作为默认编码风格的好处是吸引人的——语法一致性,加上像most Vexing Parse这样的问题消失了。

也就是说,当初始化列表只包含一个元素时,初始化对象从该元素初始化(§8.5.4/3)。这使得示例中的初始化等同于常规的直接初始化(除了不允许窄化转换)。

换句话说,你的例子中的area{-1}area(-1)都是直接初始化的,它们是等价的。选择一个而不是另一个只是一个风格问题。

它们的行为是否有不同的优势/情况?

如上所述,它们的行为不同的一种情况是由涉及窄化转换的初始化给出的。例如,虽然允许这样做:

int x{42};

这不是:

int y{3.14}; // ERROR! Narrowing conversion

这对标量没有影响,但作者可能遵循了新的语法。例如,在c++ 11之前,您不能通过初始化器列表初始化数组,但是可以通过aggregate-initialization:

轻松实现这一点。
struct A
{
    A() : data{1, 2, 3} // this wouldn't work as 'data(1, 2, 3)'
    {}
    int data[3];
};

同样,对于向量也可以这样做。