问题: 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中文网其他相关文章!