c++ - 我应该在构造函数初始化列表中使用列表初始化吗?

标签 c++ c++11 initialization

在 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/

相关文章:

c++ - iostream和命名空间std有什么关系?

c++ - Macports GCC 4.8 无法链接 OSX Lion 上的 c++ 库

c - 对未设置的值使用 IEEE754 浮点 NaN 是个好主意吗?

java - 抽象类构造函数参数与最终数据的抽象方法

c++ - 在文件中存储类的类型

c++ - 为 Linux 开发 C++ MySQL 应用程序的资源

c++ - 使用 Poco 库计算文件部分的 MD5

c++ - 如何从特定应用程序捕获音频并路由到 Windows 7 中的特定音频设备?

c++ - 在容器条目上放置互斥锁的安全有效的方法

vba - Scripting.Dictionary 的干净初始化