首页 >后端开发 >C++ >`std::initializer_list` 返回值的生命周期是否延伸到调用函数中?

`std::initializer_list` 返回值的生命周期是否延伸到调用函数中?

Patricia Arquette
Patricia Arquette原创
2024-10-28 22:44:021067浏览

Does the Lifetime of a `std::initializer_list` Return Value Extend into the Calling Function?

std::initializer_list 返回值的生命周期

问题:

根据 C 标准,当一个函数返回一个初始化列表,其底层数组的生命周期是否应该延伸到调用函数中?

分析

C 标准规定 std::initializer_list 对象的生命周期与其初始化的对象相同。当函数返回初始化列表时,它会初始化返回值对象。然而,涉及到初始化列表的两个实例:函数中的一个和调用代码中的一个。

标准中的示例表明数组的生命周期延伸到复制到的对象,这意味着返回值的数组也应该在调用函数中保留。然而,实际情况并非如此。

答案:

目前,std::initializer_list 返回值的生命周期行为在C 标准。不同的编译器以不同的方式实现它:

  • GCC 在返回之前错误地销毁数组,同时保留命名初始化列表。
  • Clang 正确处理标准中的示例,但从不销毁对象中的对象列表。这会导致内存泄漏。
  • ICC 根本不支持初始化列表。

总之,目前不可能依赖 std:: 的生命周期initializer_list 返回值扩展到调用函数中。避免使用 std::initializer_list 传递值,因为它可能会导致意外行为。

附加说明:

DR 1290 修改了标准的措辞,并且DR 1565 和 1599 仍处于开放状态,解决了相关问题。然而,语义仍在定义中,编译器需要时间来实现最终的更改。

以上是`std::initializer_list` 返回值的生命周期是否延伸到调用函数中?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn