c++ - c++11 中 std::initializer_list 的好处

标签 c++ c++11 initializer-list

我想知道使用 std::initializer_list 有什么好处,它有什么作用。

我遇到了以下情况:Why is list initialization (using curly braces) better than the alternatives?

并了解“非缩小”效果,虽然我看不出它有多大好处。

我发现的另一个好处是初始化时相对容易使用(例如初始化具有多个成员的类时),但除此之外我没有看到任何重大改进,这确实使使用 initializer_list 进行初始化成为一种很好的做法,尤其是在效率方面。

最佳答案

对于大多数实际用途,std::initializer_list 提供了一个好处:能够初始化任意类型的对象。

没有缩小是好的,但与能够输入类似内容的简单便利相比,绝对相形见绌:

std::vector<int> foo { 1, 2, 3, 4};

而不是:

std::vector<int> foo;
foo.push_back(1);
foo.push_back(2);
foo.push_back(3);
foo.push_back(4);

...或产生的大量黑客攻击,主要基于滥用逗号运算符的重载以获得如下语法:

std::vector<int> foo;
foo += (1, 2, 3, 4);

是的,这可以在速度方面带来一些切实的好处(例如),因为 vector 将预先分配空间以防止在从 initializer_list 初始化期间重新分配空间。这显然是一件好事——但老实说,它很少能促成交易。如果 intializer_list 更方便但可能会慢一些,人们无论如何都会使用它(在大多数情况下这是正确的)。

关于c++ - c++11 中 std::initializer_list 的好处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40818262/

相关文章:

c++ - VideoWriter 不写任何东西

c++ - 训练 NN 计算 atan2(y, x)

c++ - 对整数类型重载 std::isnan 和 std::isinf

c++ - 由于未知的模板定义,模板特化失败

c++ - inotify 是一次性解决方案吗

c++ - 如何在Qt中拖动一个未装饰的窗口

c++ - 尝试获取 vector 迭代器的值时出现总线错误 10

c++ - 这是对花括号初始化列表的不安全使用吗?

c++ - 通过 make_unique/make_shared 调用 initializer_list 构造函数

c++ - 传递初始化列表或容器,寻找移动语义?