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

时间:2013-05-27 22:16:56

标签: c++ c++11 initialization

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

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

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

2 个答案:

答案 0 :(得分:6)

  

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

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

目前,作者所倡导的风格和品味是否会成为事实上的标准很难说清楚。我们都知道统一初始化毕竟不是 统一。另一方面,在大多数情况下,采用它作为默认编码风格的好处是吸引人的 - 句法一致性,以及诸如最令人烦恼的解析之类的问题消失的事实。

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

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

  

他们的行为有不同的优势/情况吗?

如上所述,一种表现不同的情况是由涉及缩小转换的初始化给出的。例如,虽然这是允许的:

int x{42};

这不是:

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

答案 1 :(得分:3)

这不会对标量产生影响,但作者可能符合新语法。例如,在C ++ 11之前,您无法通过初始化列表初始化数组,但这可以通过聚合初始化轻松实现:

struct A
{
    A() : data{1, 2, 3} // this wouldn't work as 'data(1, 2, 3)'
    {}

    int data[3];
};

同样,你也会对矢量做同样的事。