【问题标题】:What is a temporary object with static storage duration什么是具有静态存储期限的临时对象
【发布时间】:2018-06-05 07:57:13
【问题描述】:

灵感来自this answer,来自[expr.const]

常量表达式要么是泛指值核心常量表达式,它引用作为常量表达式(如下定义)的允许结果的实体,要么是值满足以下约束的纯右值核心常量表达式:

  • 如果值是类类型的对象,则每个引用类型的非静态数据成员引用一个实体,该实体是常量表达式的允许结果,

  • 如果值是指针类型,则它包含具有静态存储持续时间的对象的地址、此类对象末尾的地址 ([expr.add])、函数的地址或空指针价值,和

  • 如果该值是类或数组类型的对象,则每个子对象都满足该值的这些约束。

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

究竟什么是具有静态存储持续时间的临时对象?我是否遗漏了某些东西,或者一个对象既是临时的又具有静态存储持续时间是自相矛盾的吗?

来自[basic.stc.static]的定义

所有没有动态存储时长、没有线程存储时长、非本地变量都有静态存储时长。这些实体的存储将持续整个程序的持续时间

仅适用于变量

【问题讨论】:

  • 我会说static const T& t = T();
  • @molbdnilo 链接的答案实际上是说临时 not 有静态存储持续时间
  • @PasserBy:那么它有什么存储时长
  • @PasserBy 我也有同样的困惑,但在链接的答案中,我们有 const T& r... 这不是静态存储持续时间参考。

标签: c++ language-lawyer


【解决方案1】:

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

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

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

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

添加了重点。请注意,第 15.2 节是 [class.temporary]:临时对象的规则。

因此,我们可以得出结论,临时对象具有存储持续时间。我们可以得出结论,临时对象必须具有这些存储持续时间之一。事实上,标准中有许多关于“变量或临时对象”及其存储期限的参考。

但是,尽管这清楚地表明临时对象具有其中一种存储期限……但标准从未真正说明它们具有的存储期限。 [class.temporary] 没有声明说绑定到引用的临时对象具有其引用的存储持续时间。而且 [basic.stc] 对静态、自动和线程本地持续时间的解释总是提到变量。

所以我会说这是措辞上的缺陷。标准期望临时对象有适当的存储持续时间似乎很清楚;该标准在多个地方讨论了变量或临时对象的存储持续时间。但它从未说明它们实际拥有的存储期限。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-07-19
  • 2020-02-12
  • 1970-01-01
  • 2019-08-09
  • 2021-11-08
  • 2020-03-22
  • 1970-01-01
  • 2015-04-28
相关资源
最近更新 更多