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

MBZ*_*MBZ 7 c++ struct c++11

C++11这里可以初始化struct使用统一初始化,如下所示:

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

private:
    int x_;
    double y_;
};

BasicStruct var1{5, 3.2};
Run Code Online (Sandbox Code Playgroud)

问题:

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

  2. 我什么时候应该初始化一个属性x_{x}而不是旧的时尚方式x_(x)

Pot*_*ter 7

当列表是通用的时,使用列表初始化,您可以替换另一个容器,例如数组,聚合或a 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 ) };
Run Code Online (Sandbox Code Playgroud)

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

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

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

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