【问题标题】:Unspecified Implicit Object Creation未指定的隐式对象创建
【发布时间】:2020-03-10 22:33:12
【问题描述】:

由于P0593 Implicit creation of objects for low-level object manipulation 已被接受,现在可以在 C++20 中隐式创建对象。

特别是提案引入的措辞允许某些操作(如std::malloc)自动创建并启动某些类型的对象的生命周期,即所谓的implicit-lifetime typesif 引入此类对象将导致具有未定义行为的程序具​​有已定义行为。见[intro.object]/10

草案现在进一步指出,如果可以隐式创建多组此类对象以赋予程序定义的行为,则未指定创建这些组中的哪一个。 (相关句子似乎没有出现在我可以访问的最后一个提案修订版 R5 中,但在提交草案中。)

实际上是否有一个程序可以观察到这种隐式创建的对象集的选择?换句话说,是否有一个程序通过这个新规则具有已定义但未指定的行为,以便可以从输出中推断出创建了哪些类型的隐式对象(在多个可能的对象中)?

或者这句话只是为了澄清抽象机器上的程序执行(没有明显的影响)?

【问题讨论】:

  • (OT) 如果一个隐式创建的对象是一个int,我们可以称之为“隐式int”吗?
  • 似乎不清楚从未指定集合中选择元素是否必须在 malloc 点知道
  • @MM 我假设集合的选择被认为是抽象地发生在执行流程之外的整个程序执行的单一选择,但创建直接发生在相关操作中(即@ 987654325@),否则你会遇到定义递归取决于未来的问题。
  • 我就该主题提出了另一个问题,stackoverflow.com/questions/60627249。当然,一些推论会浮现在脑海中,但一次一个问题..
  • 该提案声称不可能如此区分,这很重要,因为没有办法“正确”做出选择,只有优化以避免这种情况,否则(非常 严格)有效。

标签: c++ language-lawyer c++20


【解决方案1】:

我们以标准中的例子为例,稍作改动:

#include <cstdlib>
struct X { int a, b; };
X *make_x() {
  // The call to std::malloc implicitly creates an object of type X
  // and its subobjects a and b, and returns a pointer to that X object
  // (or an object that is pointer-interconvertible ([basic.compound]) with it),
  // in order to give the subsequent class member access operations
  // defined behavior.
  X *p = (X*)std::malloc(sizeof(struct X) * 2); // me: added the *2
  p->a = 1;
  p->b = 2;
  return p;
}

以前,只有一组有效对象可以在该存储中隐式创建 - 它必须恰好是一个 X。但是现在,我们有两个 Xs 的存储空间,但只写入其中一个,并且该程序中没有任何内容会触及其余字节。所以可以隐式创建许多不同的对象集——可能是两个Xs,可能是一个X和两个ints,可能是一个X和八个chars,......

创建哪个集合是不可观察的,因为如果有任何实际的观察结果,这会将可能性降低到只有那些有效的集合。如果我们做了类似p[1]-&gt;a = 3 的事情,那么可能性的宇宙就会崩溃到只有两个Xs 的那个。

换句话说,只有当程序中没有足够的观察结果来区分它们的有效性时,才会出现多组隐式创建的对象。如果有一种方法可以区分,那么根据定义,它们不会都是有效的。

【讨论】:

  • 这只是我的猜测。
  • 所以我认为根本没有办法在没有未定义行为的情况下区分/观察不同隐式生命周期类型的对象的存在或不存在。在那种情况下,在我看来,它是标准中唯一不能真正导致不同可观察结果的“未指定行为”。
  • 或者如果唯一的访问是通过类型为 [cv] charunsigned charstd::byte 的 glvalues 怎么办?我猜那里也可能存在任何可简单复制的类型的对象?
  • 即使在原始示例中,也可以创建一个数组对象以及一个 X 对象。
猜你喜欢
  • 2010-11-03
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
  • 2016-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多