我何时应该使用统一初始化?

时间:2013-08-15 00:24:39

标签: c++ c++11 struct

C++11中,可以使用如下所示的统一初始化来初始化struct

struct BasicStruct {
    BasicStruct (int x, double y) : x_{x}, y_{y} {}

private:
    int x_;
    double y_;
};

BasicStruct var1{5, 3.2};

问题:

  1. 我应该何时使用此语法BasicStruct var1{5, 3.2}而不是像BasicStruct var1(5, 3.2)那样调用构造函数?

  2. 我应该何时初始化x_{x}之类的属性,而不是旧方式x_(x)

1 个答案:

答案 0 :(得分:6)

当列表是通用的时使用列表初始化,您可以替换另一个容器,例如数组,聚合或vector,而不会更改其含义。

// "triplet" may be a struct, an array, or a std::vector,
// but it has at least single-precision floating-point values.
triplet dimensions { 5, 1.2f, static_cast< float >( M_PI ) };

如果要构造一个具有特定构造函数参数的特定类,那么老式的parens更合适。

使用braced-init-list初始化的一个独特功能是它不允许缩小转换,这可能导致数字数据丢失,例如浮点数的小数部分或long的高位。这有助于标记(或防止)由于例如替换而导致的错误。代码重构期间较窄的数组类型。

同样地,x{ y }适合的另一种情况是执行数字转换而不是有损。 x( y )会非常努力地进行转换,即使诉诸reinterpret_cast,也应该避免使用。

术语“统一初始化”有点乐观,并且它没有出现在标准中。它并不适用于所有情况。大括号通常表示列表,因此它被正确地称为列表初始化。那就是应该使用它。