参见英文答案 >
Why is list initialization (using curly braces) better than the alternatives?3个
在C 11中,可以使用统一初始化初始化结构,如下所示:
在C 11中,可以使用统一初始化初始化结构,如下所示:
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)?
解决方法
当列表是通用的时,使用列表初始化,您可以替换另一个容器,例如数组,聚合或向量,而不会更改其含义.
// "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,并且通常应该避免.
术语“统一初始化”有点乐观,并没有出现在标准中.它并不适用于所有情况.大括号通常表示列表,因此它被正确地称为列表初始化.那就是它应该被使用的时候.