在C++11
中,可以使用如下所示的统一初始化来初始化struct
:
struct BasicStruct {
BasicStruct (int x, double y) : x_{x}, y_{y} {}
private:
int x_;
double y_;
};
BasicStruct var1{5, 3.2};
问题:
我应该何时使用此语法BasicStruct var1{5, 3.2}
而不是像BasicStruct var1(5, 3.2)
那样调用构造函数?
我应该何时初始化x_{x}
之类的属性,而不是旧方式x_(x)
?
答案 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
,也应该避免使用。
术语“统一初始化”有点乐观,并且它没有出现在标准中。它并不适用于所有情况。大括号通常表示列表,因此它被正确地称为列表初始化。那就是应该使用它。