C ++-std :: initializer_list与std :: span

克里斯蒂安·帕诺夫(Christian Panov)

std :: initializer_liststd :: span有什么区别两者都是某种类型的值的连续序列。两者都不是所有者。那么我们什么时候使用第一个,什么时候使用后者?

巴里

简短的答案是std::initializer_list<T>用于初始化的目的是创建新范围。虽然std::span<T>用于指代现有范围,但可提供更好的API。


std::initializer_list<T>是一种语言功能,实际上构造了一个新数组并拥有它。它解决了如何方便地初始化容器的问题:

template <typename T>
struct vector {
    vector(std::initializer_list<T>);
};

vector<int> v = {1, 2, 3, 4};

这会std::initializer_list<int>即时创建一个包含四个整数的动态对象,并将其传递给它,vector以便可以正确地构造自己。

实际上,这是唯一std::initializer_list<T>应该使用的地方:为方便起见,构造函数或函数参数都会动态传递范围(单元测试是需要这种便利的常见位置)。


std::span<T>另一方面,用于指代现有范围。它的工作是替换以下形式的功能:

void do_something(int*, size_t);

void do_something(std::span<int>);

这使得此类功能通常更易于使用且更安全。std::span可以在任何适当的连续范围内构造,因此以前面的示例为例:

std::vector<int> v = {1, 2, 3, 4};
do_something(v); // ok

它也可以用来替换以下形式的函数:

void do_something_else(std::vector<unsigned char> const&);

具体来说,只能使用a来调用vector

void do_something_else(std::span<unsigned char const>);

可以使用上的任何支持连续存储来调用unsigned char

随着span你必须要小心,因为它基本上是一个引用,只是没有得到与拼写&,但它是一个非常有用的类型。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C ++ std :: initializer_list用法

为什么C ++ 11中的std :: initializer_list重载了std :: begin()和std :: end()?

std :: initializer_list的实现

std :: initializer_list的实现

同样的叮当声,std::initializer_list 程序与 -std=c++14/-std=c++17 的结果不同

std :: initializer_list和c array []的优缺点是什么?

为什么C ++使std :: initializer_list的元素类型为const?

C ++ 11:编译器何时将{}视为std :: initializer_list,何时不考虑?

C ++将std :: initializer_list强制转换为模板化函数中的容器

为c样式的字符串创建std :: initializer_list构造函数

C ++ 11可以构造一个std :: initializer_list吗?

如何从嵌套的std :: initializer_list初始化2D C样式数组?

C ++构造函数采用大小为一的std :: initializer_list

如何将C数组转换为std :: initializer_list?

std :: initializer_list可以专用吗?

std :: initializer_list和引用类型

std :: initializer_list构造函数

在clang中返回std :: initializer_list

无法从std :: initializer_list <int>构造std :: initializer_list <int const>

std :: strings的std :: initializer_list的奇怪行为

带有 std::thread 的 std::initializer_list

自动功能中带有std :: initializer_list <int>且不带const的==测试的C ++ 1z处理

为什么Clang无法优化std :: initializer_list?

使用std :: initializer_list构造函数而不会产生歧义?

是否可以以编程方式构造std :: initializer_list?

检查元素是否在std :: initializer_list中

做std :: initializer_list const会改变什么吗?

构造函数中的std :: initializer_list转换

为什么std :: initializer_list不是内置语言?