首页 > 后端开发 > C++ > 正文

GCC 对返回的 `std::initializer_list` 数组的破坏是否正确?

Linda Hamilton
发布: 2024-11-01 17:08:02
原创
327 人浏览过

Is GCC's Destruction of a Returned `std::initializer_list` Array Correct?

返回的 std::initializer_list 数组的生命周期

从函数返回的 std::initializer_list 数组的生命周期引发了关于不同编译器中的行为。问题是 GCC 在返回完整表达式末尾对数组的破坏是否正确。

标准分析

根据 C 11 §6.6。 3/2,带有花括号初始化列表的 return 语句会导致返回的对象或引用从初始化列表中进行复制列表初始化。此过程从初始化器列表初始化一个临时的initializer_list对象及其底层数组存储,然后从第一个初始化另一个initializer_list。

数组的生命周期,如8.5.4/6中定义,与initializer_list 对象的生命周期。这可以通过一个示例来理解,其中,initializer_list 对象和数组对于使用花括号初始化列表初始化的 std::vector 具有完整表达式生命周期。

花括号初始化的返回值-List

当返回用大括号括起来的裸列表时,使用复制列表初始化。这类似于语法 nocopy X = { 3 },不涉及复制,并且与 8.5.4/6 中延长数组生命周期的示例相同。

GCC 问题和 Clang

但是,GCC 和 Clang 之间的实现存在差异。 GCC 在返回之前销毁数组,而 Clang 保留一个命名的initializer_list,但从不销毁列表中的对象。

建议

建议避免使用 std:: initializer_list 传递值并期望它们持续存在。标准和编译器实现的不确定性使其在保留对象生命周期方面不可靠。

以上是GCC 对返回的 `std::initializer_list` 数组的破坏是否正确?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!