【问题标题】:What is the storage duration of a temporary object: automatic, thread, static, or dynamic?临时对象的存储持续时间是多少:自动、线程、静态或动态?
【发布时间】:2021-11-08 13:35:51
【问题描述】:

temporary objectstorage duration 是什么:自动、线程、静态还是动态?

我知道临时对象的 lifetime 在创建它的完整表达式处或之前结束,除非它绑定到引用,在这种情况下,它的生命周期会扩展到引用的生命周期,这给了我们临时对象存储持续时间结束的下限。

【问题讨论】:

标签: c++ temporary-objects storage-duration


【解决方案1】:

标准有点模糊。它说临时对象可以具有自动、线程或静态存储持续时间,但在这些存储持续时间的定义内,它只指定变量何时具有这样的持续时间。

标准并没有准确说明每种情况下临时的存储持续时间是多少。相反,它单独描述了临时对象何时被销毁。

除非我弄错了,否则模糊性应该无关紧要。知道对象的存储期限名称对于了解它的生命周期很有用(如果没有另外指定),但是临时对象的生命周期是另外指定的,所以存储期限名称据我所知没有提供额外的信息。

虽然标准没有这样说,但可以合理地假设,当临时对象的生命周期被引用延长时,临时对象的存储持续时间与引用的存储时间相同。否则,生命周期类似于在完整表达式周围的假设块内具有自动存储持续时间的变量。

【讨论】:

    【解决方案2】:

    来自您自己的链接:

    静态存储时长

    • (1.1) 没有线程存储持续时间和

    • (1.2) 属于命名空间范围 ([basic.scope.namespace]) 或首先用 static 或 extern 关键字声明 ([dcl.stc])

    临时变量根本没有被声明,所以它们不能用staticextern 关键字声明。它们通常不属于命名空间范围。

    线程存储时长

    只有当它们被明确声明为thread_local,所以那个不适用。

    自动存储时长

    属于块或参数范围且未显式声明为 static、thread_local 或 extern 的变量具有自动存储持续时间

    这将适用于大多数临时对象,因为它们没有显式声明任何东西,而是由表达式创建,其中大部分位于块范围内的某个地方。

    例外是静态绑定到具有非自动存储持续时间的引用:它必须继承引用的存储持续时间。

    记录在案的example 是一个临时绑定到具有命名空间范围的引用,并且必须继承静态持续时间。

    const S& cr = S(16)+S(23);
    

    请注意,在该示例中,用作operator+ 参数的临时变量不会仅仅因为它们的表达式位于命名空间范围内而获得静态持续时间:它们仍然是参数范围,因此是自动的。

    【讨论】:

    • 临时对象不是变量,是吗?
    • 不——啊,我看到持续时间引用是在变量方面,即使它被描述为对象的属性。将弄清楚如何改进。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 2015-04-28
    相关资源
    最近更新 更多