gpt4 book ai didi

c - C 中的临时对象

转载 作者:太空狗 更新时间:2023-10-29 17:25:55 25 4
gpt4 key购买 nike

在 C11 中,术语temporary lifetime 被定义为:

C11 6.2.4p8: A non-lvalue expression with structure or union type, where the structure or union contains a member with array type (including, recursively, members of all contained structures and unions) refers to an object with automatic storage duration and temporary lifetime. 36) Its lifetime begins when the expression is evaluated and its initial value is the value of the expression. Its lifetime ends when the evaluation of the containing full expression or full declarator ends. Any attempt to modify an object with temporary lifetime results in undefined behavior.

我想知道为什么这只适用于具有数组成员的结构或 union 类型的右值。数组有什么特别之处?

struct x { int xx; };
struct y { int yy[1]; };

(struct x) { 42 }; // *not* a temporary object
(struct y) { { 42 } }; // a temporary object

为什么第一个对象不是临时对象而第二个对象是临时对象?

最佳答案

限制只适用于包含数组的临时对象的原因是因为限制只与包含数组的临时对象相关——当你有一个不包含数组的未命名非左值对象时,你不能从对象中获取地址;明确禁止使用 &。但是,当该对象包含一个数组,并且您通过名称访问该数组时,您将隐式获取该数组第一个元素的地址。在 C11 之前,尝试对该指针做任何事情都是未定义的行为。使用 C11,您现在可以使用对象(和指针),只是不能修改它。


请注意,问题中的示例(带有复合文字)不是临时对象 - 复合文字是左值,因此可以使用它们的地址,并且具有静态存储持续时间。

获得临时对象的主要方式是当您有一个返回结构(或 union )类型的函数时——当您调用这样的函数时,返回值是一个临时对象。因为它不是左值,所以不能在其上使用 &,但如果它包含数组,则可以使用数组名称,这将隐式衰减为指向数组第一个元素的指针.

关于c - C 中的临时对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55887539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com