返回的 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中文网其他相关文章!