C++中static const initializer_list的转换规则是否符合预期?
关于static const std::initializer_list底层数组的存储特性
是的,可以认为你给出的等价转换符合C++标准语义——static const std::initializer_list关联的底层数组会同步拥有static存储期(同时保持const)。
原因如下:
std::initializer_list本身不存储元素,仅持有指向底层数组的指针和元素数量,其语义完全依赖于底层数组的生命周期。- 函数内的
static对象,标准要求它在程序整个生命周期内持续有效且仅初始化一次。如果kInitList是static的,但关联的底层数组是自动存储期(非static),那么第一次调用foo()结束后,底层数组会被销毁,后续调用foo()时kInitList会变成悬垂引用,这完全违背了static对象的语义要求。
因此,编译器必须保证底层数组的生命周期与static的initializer_list对象一致,实际实现中必然会将底层数组也设为static const,就像你给出的转换代码那样:
void foo() { static const int __a[3] = {1, 2, 3}; static const std::initializer_list<int> kInitList(__a, __a+3); // other stuff. }
内容的提问来源于stack exchange,提问作者cbhattac
相关产品推荐
相关产品推荐

