其他分享
首页 > 其他分享> > c – 嵌套的std :: initializer_lists的数据元素是否保证是连续的?

c – 嵌套的std :: initializer_lists的数据元素是否保证是连续的?

作者:互联网

可以通过嵌套括号括起来的列表来创建多维初始值设定项,如{{1,2,3},{4,5,6}}.接受此功能的函数可以使用嵌套的std :: initializer_lists编写.

数据元素是否保证是连续的?

这是一个例子:

void f(std::initializer_list<std::initializer_list<int>> a)
{
  for(auto const & p: a)
    for(auto const & q: p)
      std::cout << &q << std::endl;
}

int main()
{
  f({{1,2,3}, {4,5,6}});
  return 0;
}

上面的代码在我的机器上输出连续的地址.

0x400c60
0x400c64
0x400c68
0x400c6c
0x400c70
0x400c74

有保证吗?

更新

答案必须是否定的.

void g(std::initializer_list<int> a, std::initializer_list<int> b)
{
  f({b,a});
}

int main()
{
  g({1,2,3}, {4,5,6});
  return 0;
}

输出是:

0x400cdc
0x400ce0
0x400ce4
0x400cd0
0x400cd4
0x400cd8

解决方法:

C11§[support.initlist] 18.9 / 1指定对于std :: initializer_list< T>迭代器必须是T *,因此可以保证单个initializer_list中的顺序元素是连续的.

在嵌套列表的情况下,例如,std :: initializer_list< std :: initializer_list< int>>,并不要求所有元素都是连续的.顶级列表的begin()必须返回指向std :: initializer_list< int>的连续数组的指针,并且每个列表’begin()必须返回指向int的连续数组的指针.这些第二层int数组可以分散在整个内存中,或者按照您观察到的完全顺序存储.两种方式都符合要求.

标签:c,c11,initializer-list
来源: https://codeday.me/bug/20190722/1507756.html