And*_*ost 4 c++ initializer-list c++11
可以通过嵌套括号括起的列表来创建多维初始值设定项,如{{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;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码在我的机器上输出连续的地址.
0x400c60
0x400c64
0x400c68
0x400c6c
0x400c70
0x400c74
Run Code Online (Sandbox Code Playgroud)
有保证吗?
答案必须是否定的.
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;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
0x400cdc
0x400ce0
0x400ce4
0x400cd0
0x400cd4
0x400cd8
Run Code Online (Sandbox Code Playgroud)
C++11§[support.initlist] 18.9/1指定std::initializer_list<T> iterator必须如此T*,因此可以保证单个initializer_list中的顺序元素是连续的.
例如,在嵌套列表的情况下,std::initializer_list<std::initializer_list<int>>不要求所有元素都是连续的.顶级列表begin()必须返回指向连续数组的指针std::initializer_list<int>,并且每个列表begin()必须返回指向连续数组的指针int.这些第二层int阵列可以分散在整个存储器中,或者按照您观察到的完全顺序存储.两种方式都符合要求.
| 归档时间: |
|
| 查看次数: |
678 次 |
| 最近记录: |