在 GotW #6b 第 2 部分中,我们找到了代码
class polygon {
public:
polygon() : area{-1} {}
//....
double area;
};
为什么我们应该对基本类型使用列表初始化而不是常用的area(-1)
?他们有什么不同的优势/情况吗?
在 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 之前,您无法通过初始化列表初始化数组,但这可以通过聚合初始化轻松解决:
struct A
{
A() : data{1, 2, 3} // this wouldn't work as 'data(1, 2, 3)'
{}
int data[3];
};
同样,你也会对向量做同样的事情。