4

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

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

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

4

2 回答 2

6

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

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

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

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

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

他们有什么不同的优势/情况吗?

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

int x{42};

这不是:

int y{3.14}; // ERROR! Narrowing conversion
于 2013-05-27T22:26:27.487 回答
3

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

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

    int data[3];
};

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

于 2013-05-27T22:30:07.293 回答