C++ 我应该在构造函数初始值设定项列表中使用列表初始化吗?

C++ 我应该在构造函数初始值设定项列表中使用列表初始化吗?,c++,c++11,initialization,C++,C++11,Initialization,在GotW#6b第2部分中,我们找到了代码 class polygon { public: polygon() : area{-1} {} //.... double area; }; 为什么我们应该对基本类型使用列表初始化,而不是常用的区域(-1)?他们有没有表现不同的优势/情况 为什么我们应该对基本类型使用列表初始化,而不是常用区域(-1) 首先,我认为这里传递的信息是,只要可以使用C++11,就应该使用它的统一初始化。在这种情况下,主要是风格和品味的问题 现在很难

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

class polygon {
public:
    polygon() : area{-1} {}
    //....
    double area;
};
为什么我们应该对基本类型使用列表初始化,而不是常用的
区域(-1)
?他们有没有表现不同的优势/情况

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

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

现在很难说作者所提倡的风格和品味是否会成为事实上的标准。我们都知道,统一初始化毕竟不是那么统一的。另一方面,在大多数情况下,采用它作为默认编码风格的好处是吸引人的——语法一致性,加上诸如最烦人的解析等问题消失的事实

也就是说,当初始值设定项列表仅包含一个元素时,初始化对象将从该元素初始化(§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];
};

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

如果要调用初始值设定项列表构造函数?:)我猜想它只是和整个“统一”的方面一起流动。“克里斯应该提到的<代码>区域<代码>是一个代码>双<代码>。尽管它不是具体的构造函数初始化列表,但仍然是一个行为不同的情况。在他的书《例外C++》中,他使用了区域(-1)。在第177页第43项。@taocp lol&您刚刚知道:)正确,我的意思是列表初始化。事实上,不久前我问了一个问题——我一定是忘了。@LuchianGrigore:好的。我对答案进行了编辑,以使编辑内容与问题相匹配