9

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)

4

1 回答 1

8

当列表是通用的并且您可以替换另一个容器(例如数组、聚合或 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 ) };

如果您正在使用特定构造函数的参数构造特定类,那么老式的括号更合适。

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

同样,另x{ y }一种合适的情况是在执行您不会有损的数字转换时。x( y )将非常努力地进行转换,甚至诉诸 a reinterpret_cast,通常应该避免。

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

于 2013-08-15T00:31:59.157 回答