【问题标题】:What does "invoked" mean in the standard when referring to destructor?当提到析构函数时,标准中的“调用”是什么意思?
【发布时间】:2016-12-16 04:31:18
【问题描述】:

invoked 是否意味着析构函数已被调用并完成/返回,或者仅仅是它已被调用?一直以为是后者,直到在12.4 Destructors部分看到这句话(多稿都有这个):

一旦为对象调用析构函数,该对象就不再存在

如果 invoked 仅仅意味着调用已经开始,那就意味着 this 在析构函数的主体中是无效的。

如果 invoked 意味着调用并完成,这意味着一个对象在其析构函数运行时仍然“存在”并且可能从另一个线程(即是什么让我首先看到了标准)。其他答案声称情况并非如此,但不要用消息来源支持它,所以我倾向于认为它们是错误的。

【问题讨论】:

  • that would imply that an object still "exists" while its destructor is running and could be accessed from perhaps another thread .. 这是 dtor .. 资源清理 .. 和 std::mutex 的要点之一,以确保您不会访问已处置的对象 ..

标签: c++ language-lawyer destructor


【解决方案1】:

这很简单。首先,对这个特定陈述的一种解释会产生矛盾,而另一种解释则不会。选择。其次,该标准假定读者具有一定的常识。例如,不假设一个术语与上下文无关。

【讨论】:

  • 标准在哪里说它假设读者有常识?
  • @RyanHaining 没有常识的人做C,所以我们很安全
  • @RyanHaining:作为参考,它在 ISO 程序标准之一中。并且用稍微不同的词。 IIRC,“除非另有定义,否则单词具有其正常的英语含义”。这就是为什么C++明确定义了“表达式”,你不能用常识来推导出C++的含义。
  • @MSalters 我对“invoke”的“常识”翻译将是一个叫做函数的东西,但并不是说它一定已经完成了,我想我错了。回想起来,我应该更具体地问这个问题,关于你是否可以让另一个成员函数与析构函数同时运行。
猜你喜欢
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
  • 1970-01-01
  • 2020-07-06
  • 2019-12-17
相关资源
最近更新 更多