【发布时间】:2020-03-10 22:33:12
【问题描述】:
由于P0593 Implicit creation of objects for low-level object manipulation 已被接受,现在可以在 C++20 中隐式创建对象。
特别是提案引入的措辞允许某些操作(如std::malloc)自动创建并启动某些类型的对象的生命周期,即所谓的implicit-lifetime types,if 引入此类对象将导致具有未定义行为的程序具有已定义行为。见[intro.object]/10。
草案现在进一步指出,如果可以隐式创建多组此类对象以赋予程序定义的行为,则未指定创建这些组中的哪一个。 (相关句子似乎没有出现在我可以访问的最后一个提案修订版 R5 中,但在提交草案中。)
实际上是否有一个程序可以观察到这种隐式创建的对象集的选择?换句话说,是否有一个程序通过这个新规则具有已定义但未指定的行为,以便可以从输出中推断出创建了哪些类型的隐式对象(在多个可能的对象中)?
或者这句话只是为了澄清抽象机器上的程序执行(没有明显的影响)?
【问题讨论】:
-
(OT) 如果一个隐式创建的对象是一个int,我们可以称之为“隐式int”吗?
-
似乎不清楚从未指定集合中选择元素是否必须在 malloc 点知道
-
@MM 我假设集合的选择被认为是抽象地发生在执行流程之外的整个程序执行的单一选择,但创建直接发生在相关操作中(即@ 987654325@),否则你会遇到定义递归取决于未来的问题。
-
我就该主题提出了另一个问题,stackoverflow.com/questions/60627249。当然,一些推论会浮现在脑海中,但一次一个问题..
-
该提案声称不可能如此区分,这很重要,因为没有办法“正确”做出选择,只有优化以避免这种情况,否则(非常 严格)有效。
标签: c++ language-lawyer c++20