【发布时间】: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