【问题标题】:Why is it possible to call destructor from const reference? [duplicate]为什么可以从 const 引用调用析构函数? [复制]
【发布时间】:2018-03-10 19:43:14
【问题描述】:

在使用placement new / delete 之后,我想出了这段代码,令我惊讶的是,它可以编译和运行(至少在gcc 和clang 上):

int main()
{
    struct A{};
    A a;
    const A& b = a;
    b.~A();
}

我测试了更复杂的版本,例如 A 的析构函数调用非 const 限定的成员。 这种从 const 引用调用析构函数的能力有充分的理由吗?

【问题讨论】:

  • 如果不允许在 const 对象上调用析构函数,否则您将如何销毁该对象?假设您在程序中有const A;。在您的示例中离开范围,,程序退出时,它的析构函数被调用。如果不允许这样做会发生什么?
  • 这是有道理的。我会质疑隐式和显式析构函数调用之间的处理差异......无论如何,小心使用显式析构函数调用的另一个原因。
  • 我不确定您是否想显式调用析构函数。检查句子“请注意,直接为普通对象(例如局部变量)调用析构函数,在作用域结束时再次调用析构函数时会调用未定义的行为。”在cppreference.
  • @ArdaAytekin 是的,除了从对齐存储进行投射的用例之外。我背后的问题是我是否可以将其转换为 const A&,答案似乎是肯定的。
  • 对不起。由于您的示例 是关于从 const 引用中销毁本地对象,因此我想记下。否则,下面的答案也很好。除非其他人第二次尝试a->~A();,否则这不是未定义的行为。

标签: c++ constants destructor


【解决方案1】:

析构函数总是隐含的 const。您可以通过常量指针和引用删除对象。从 C++11 开始,您还可以通过 const-iterators 擦除容器元素。

const A* a = new A();
delete a; // OK. Deletes pointed const object, implicitly calls destructor.

【讨论】:

猜你喜欢
  • 2021-06-21
  • 1970-01-01
  • 2015-04-28
  • 2011-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-21
  • 1970-01-01
相关资源
最近更新 更多