c-保留std :: initializer_list的副本是否安全?理由是什么?
作者:互联网
在我的环境中,std :: initializer_list被实现为指向第一个元素和大小的指针.仍然在我的特定设置中,我能够观察到:
>基础数据分配在当前功能框架中(因为指向第一个元素的指针如此)
>从函数中按值返回initializer_list不会更改指针的值(导致得出的结论是,数据不会与initializer_list一起复制).
如果副本的寿命超过了原始对象,则复制initializer_list是不安全的.
>是否可以通过进一步发布C标准来保持这种行为?
>同样重要的是,这种行为背后的原理是什么? (今天真的让我很难受,所以我很天真地说这违背了“最少惊讶”的心爱原则)
解决方法:
根据C 11标准18.9 [support.initlist]:
2 An object of type initializer_list provides access to an array of objects of type const E. [ Note: A pair of pointers or a pointer plus a length would be obvious representations for initializer_list. initializer_list is used to implement initializer lists as specified in 8.5.4. Copying an initializer list does not copy the underlying elements. — end note ]
这就像获取对象的指针一样.您还可以使指针超出对象的寿命.如果您想“安全”地进行操作,请改用/存储一个元素向量.
复制元素会使其变得昂贵,因此没有人会使用它. documentation available非常清楚其功能.
编辑:
这是Stroustrup提出的initializer_list:N2100的建议.阅读它可能会启发其设计决策.
标签:c,c11,c14,initializer-list 来源: https://codeday.me/bug/20191010/1887773.html