在 GotW #6b 第 2 部分中,我们找到了代码
class polygon {
public:
polygon() : area{-1} {}
//....
double area;
};
为什么我们要对基类型使用列表初始化而不是常用的area(-1)
?他们有什么不同的优势/情况吗?
最佳答案
Why should we use list initialization for base types instead of the commonly used area(-1)?
首先,我认为那里的消息只是 C++11 的统一初始化应该在任何可以使用的地方使用。在这种情况下,主要是风格和品味问题。
作者所提倡的风格和品味是否会成为事实上的标准,目前还很难说。我们都知道统一初始化毕竟不是统一的。另一方面,在大多数情况下,采用它作为默认编码风格的好处很吸引人——句法统一,再加上诸如 Most Vexing Parse 之类的问题消失了。
这就是说,当初始化列表只包含一个元素时,初始化对象是从该元素初始化的(§ 8.5.4/3)。这使得示例中的初始化等同于常规直接初始化(除了不允许缩小转换)。
换句话说,您示例中的 area{-1}
和 area(-1)
都是直接初始化,它们是等价的。选择一个而不是另一个只是风格问题。
Are there any advantages / situations where they behave differently?
如上所述,它们表现不同的一种情况是由涉及缩小转换的初始化给出的。例如,虽然这是允许的:
int x{42};
这不是:
int y{3.14}; // ERROR! Narrowing conversion
关于c++ - 我应该在构造函数初始化列表中使用列表初始化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16781229/