在GotW#6b第2部分中,我们找到了代码
class polygon {
public:
polygon() : area{-1} {}
//....
double area;
};
为什么我们应该为基类型而不是常用的area(-1)
使用列表初始化?是否存在表现不同的优势/情况?
答案 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];
};
同样,你也会对矢量做同样的事。