对于普通对象(即使是对象const
),可以通过显式调用析构函数来结束它们的生命周期。稍后,例如,程序可以使用放置在同一内存位置启动另一个对象生命周期new
。
但是调用constexpr
对象的析构函数是否合法?它能否产生一些有用的或至少格式良好的程序?
很容易想象相反的情况:
struct A{
int v = 0;
constexpr void foo() { v ? throw 1 : ++v; }
constexpr ~A() { foo(); }
};
constexpr A y;
int main() { y.~A(); y.~A(); }
这个(很可能是格式错误的)程序被所有编译器接受,没有任何警告:https ://gcc.godbolt.org/z/aqMbfjxKT
在 Clang 中,它通过constexpr
从A
.