【问题标题】:When should I use uniform initialization? [duplicate]什么时候应该使用统一初始化? [复制]
【发布时间】:2013-08-17 03:45:49
【问题描述】:

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)

【问题讨论】:

  • 不,这是“为什么”,这是“何时”。认真的人。
  • @Rapptz 好的,现在找到一个有意义的答案,或者比我在这里添加的更好:)
  • @Potatoswatter 在我看来,您的回答并没有真正为重复链接添加任何内容。
  • @Rapptz 它还解释了区别是什么,引用了标准,没有提到一般的最佳实践。第二个答案是完全错误的。

标签: c++ c++11 struct


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 2017-05-10
    • 1970-01-01
    • 2019-12-26
    • 2010-12-24
    • 2014-05-19
    相关资源
    最近更新 更多