首页 >后端开发 >C++ >GCC 是否会在返回完整表达式结束之前销毁从函数返回的 `std::initializer_list` 数组?

GCC 是否会在返回完整表达式结束之前销毁从函数返回的 `std::initializer_list` 数组?

Linda Hamilton
Linda Hamilton原创
2024-10-29 09:35:30532浏览

 Does GCC Destroy `std::initializer_list` Arrays Returned from Functions Before the End of the Return Full-Expression?

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

概述

问题: GCC 的实现破坏了 a 是否正确std::initializer_list 数组从返回完整表达式末尾的函数返回?

分析

答案: 不,这是不正确的。

详细说明

根据 C 11 标准,带有花括号初始化列表的 return 语句会初始化复制列表初始化要从指定的初始值设定项列表返回的对象或引用。当使用初始化器列表创建initializer_list对象时,会分配一个数组来存储列表的元素。数组的生命周期定义如下:

数组的生命周期与initializer_list对象的生命周期相同。

在提供的示例中,initializer_list对象被创建为返回来自 send() 函数的值。它使用三个noisydt 对象进行初始化,然后返回到receive() 函数。与initializer_list对象关联的数组的生命周期应该扩展到receive()函数中,允许访问和使用列表的元素。

但是,GCC实现错误地在返回值之前销毁了数组可以使用,导致未定义的行为。正确的行为是数组持续存在,直到 receive() 函数结束。 Clang 和 ICC 都展示了正确的行为。

结论

GCC 实现对 std::initializer_list 返回值的处理不符合 C 11 标准。 Clang 和 ICC 提供了正确的实现,建议在使用 std::initializer_lists 时使用这些编译器。

以上是GCC 是否会在返回完整表达式结束之前销毁从函数返回的 `std::initializer_list` 数组?的详细内容。更多信息请关注PHP中文网其他相关文章!

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