我应该在构造函数初始化列表中使用列表初始化吗?
Should I use list initialization in a constructor initializer list?
在gotw# 6b第2部分中,我们找到了代码
class polygon {
public:
polygon() : area{-1} {}
//....
double area;
};
为什么我们应该使用列表初始化基类型,而不是常用的area(-1)
?他们的行为是否有不同的优势/情况?
为什么我们要用列表初始化基类型,而不是常用的区域(-1)?
首先,我认为这里的信息只是c++ 11的统一初始化应该在可以使用的时候使用。在这种情况下,这主要是风格和品味的问题。
作者所倡导的风格和品味是否会成为事实上的标准,目前还很难说。我们都知道统一初始化毕竟不是那个统一的。另一方面,在大多数情况下,采用它作为默认编码风格的好处是吸引人的——语法一致性,加上像most Vexing Parse这样的问题消失了。
也就是说,当初始化列表只包含一个元素时,初始化对象从该元素初始化(§8.5.4/3)。这使得示例中的初始化等同于常规的直接初始化(除了不允许窄化转换)。
换句话说,你的例子中的area{-1}
和area(-1)
都是直接初始化的,它们是等价的。选择一个而不是另一个只是一个风格问题。
它们的行为是否有不同的优势/情况?
如上所述,它们的行为不同的一种情况是由涉及窄化转换的初始化给出的。例如,虽然允许这样做:
int x{42};
这不是:
int y{3.14}; // ERROR! Narrowing conversion
这对标量没有影响,但作者可能遵循了新的语法。例如,在c++ 11之前,您不能通过初始化器列表初始化数组,但是可以通过aggregate-initialization:
轻松实现这一点。struct A
{
A() : data{1, 2, 3} // this wouldn't work as 'data(1, 2, 3)'
{}
int data[3];
};
同样,对于向量也可以这样做。
相关文章:
- C++类 - 初始化列表 - 递归 - 按值传递
- 在初始化列表之外手动调用基类的构造函数
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- std::map与谓词与初始化列表
- 类内初始化与构造函数初始化列表的顺序
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 使用初始化列表填充C++中的多维结构数组时出现问题
- 如何在初始化列表中的构造函数之后初始化变量/对象?
- C++初始化列表与分配值
- C++初始化列表中的向量集大小或调整大小
- 在构造函数初始化列表中使用 std::variant
- emplace_back初始化列表错误,当初始化列表在独立变量上工作时
- 解释了构造函数成员初始化列表
- 使用初始化列表时如何获取私有数据?
- 用初始化列表和超类构造函数声明子类构造函数的正确方式
- 如何在成员初始化列表中声明共享指针
- 庞大的初始化列表,如何修复"fatal error C1060: compiler is out of heap space"
- 我可以检查初始化列表中设置的构造函数主体中的变量吗
- 使用整数初始化列表初始化长双精度的向量
- 是否可以在C++中使用初始化列表设置数组的特定成员?