【问题标题】:The new and original object type in memory reusing内存重用中新的和原始的对象类型
【发布时间】:2014-10-31 19:45:09
【问题描述】:

如果,在对象的生命周期结束之后并且在存储之前 被占用的对象被重用或释放,一个新的对象是 在原始对象占用的存储位置创建,a 指向原始对象的指针,引用的引用 到原始对象,或者原始对象的名称将 自动引用新对象,并且一旦生命周期 新对象已启动,可用于操作新对象,如果:

——新对象的存储正好覆盖存储位置 原始对象占据了哪个位置,以及

——新对象属于 与原始对象相同的类型(忽略顶层 cv 限定符),以及

— 原始对象的类型不是 const 限定的,并且,如果 类类型,不包含任何类型为 const 限定或引用类型,以及

——原始对象是 类型 T 的最衍生对象(1.8),新对象是最 T 类型的派生对象(也就是说,它们不是基类 子对象)。

不清楚是什么类型的意思?动态型还是静态型?我认为,它是静态类型,否则后一种限制是没有意义的。

【问题讨论】:

  • 这个问题看起来和另一个问题很相似......也许有点不同,但肯定不会太大:)
  • “对象类型”始终是明确的。您可能正在考虑表达式的类型或变量的类型,但这与这里无关。

标签: c++ types


【解决方案1】:

两者。

静态类型和动态类型只有在静态类型是动态类型的基类时才能不同,但这种情况被最后的子弹排除了。

【讨论】:

  • 我同意,它基本上是在说“如果它们属于 T 类型的最派生对象,您可以使用它来操作对象”。也参见。 §1.8.2
  • _静态类型和动态类型只有在静态类型是动态类型的基类时才能不同 不,任何类型的静态和动态类型都可以不同。给定int 变量ireinterpret_cast<float&>(i)float 类型的左值,但它所引用的最派生对象(即左值表达式的动态类型)是int 类型。
  • @LanguageLawyer:严格的别名规则禁止这样做。
  • @BenVoigt 你的意思是 [basic.lval]/8 如果程序尝试通过以下类型之一以外的左值访问对象的存储值,则行为未定义 ? reinterpret_cast<float&>(i) 不访问任何内容。检查“访问”的定义timsong-cpp.github.io/cppwp/n4659/defns.access
  • @LanguageLawyer:reinterpret_cast 尚未访问任何内容,但我认为您打算对结果引用做一些事情,使其与本次讨论相关。整个“引用原始对象的引用,......可用于操作新对象,如果”。好吧,在你的例子中它不能,因为这样做会违反严格的别名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-16
  • 2020-05-07
  • 1970-01-01
  • 2017-01-23
相关资源
最近更新 更多