什么是具有静态存储持续时间的临时对象

问题描述 投票:12回答:1

灵感来自this answer[expr.const]

常量表达式是glvalue核心常量表达式,它指的是一个实体,它是常量表达式的允许结果(如下所定义),或者是一个prvalue核心常量表达式,其值满足以下约束:

  • 如果值是类类型的对象,则引用类型的每个非静态数据成员引用一个实体,该实体是常量表达式的允许结果,
  • 如果值是指针类型,则它包含具有静态存储持续时间的对象的地址,超过此类对象末尾的地址([expr.add]),函数的地址或空指针值,以及
  • 如果值是类或数组类型的对象,则每个子对象都满足这些值的约束。

如果实体是具有静态存储持续时间的对象,则该实体是常量表达式的允许结果,该对象不是临时对象,或者是其值满足上述约束的临时对象,或者它是函数。

什么是具有静态存储持续时间的临时对象?我是否遗漏了某些东西,或者说对象是暂时的并且具有静态存储持续时间是矛盾的吗?

[basic.stc.static]的定义

所有没有动态存储持续时间,没有线程存储持续时间且不是本地的变量都具有静态存储持续时间。这些实体的存储应持续到程序的持续时间

仅适用于变量。

c++ language-lawyer
1个回答
8
投票

[basic.stc] / 1告诉我们:

存储持续时间是对象的属性,它定义包含对象的存储的最小潜在生命周期。

所以每个对象都有一个存储时间。此外,第2段说:

静态,线程和自动存储持续时间与声明(6.1)引入的对象相关联,并由实现(15.2)隐式创建。

强调补充说。请注意,第15.2节是[class.temporary]:临时对象的规则。

因此,我们可以得出结论,临时对象具有存储持续时间。我们可以得出结论,临时工具必须具有其中一个存储持续时间。实际上,标准中有许多引用“变量或临时对象”及其存储持续时间。

然而,尽管这清楚地表明临时对象具有这些存储持续时间之一......标准从未真正说明它们具有的存储持续时间。 [class.temporary]没有声明说绑定到引用的临时文件具有其引用的存储持续时间。而[basic.stc]对静态,自动和线程局部持续时间的解释总是说明变量。

所以我会说这是措辞中的缺陷。很明显,该标准要求临时工具有适当的存储时间;有多个地方标准谈论变量或临时对象的存储持续时间。但它从未说明他们实际拥有的存储时间。

© www.soinside.com 2019 - 2024. All rights reserved.