对于普通对象(即使是 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
的析构函数.
最佳答案
[dcl.constexpr] A
constexpr
specifier used in an object declaration declares the object as const.
你可以用这样的对象做任何你可以用任何其他 const 对象做的事情。
constexpr
,除了暗示声明对象的常量性之外,似乎不会影响对象本身的任何内容。它只影响程序的静态属性,即哪些表达式是常量表达式,哪些模板实例化是有效的等等。对于用 constexpr
声明的对象的运行时行为没有特殊规定。说明符。该标准多次使用类似于“constexpr object”的短语,但这似乎用词不当。在我看来,它应该改为引用 constexpr 变量。不应该有“constexpr 对象”这样的东西(就像没有内联对象),只有 constexpr 变量(比如有内联变量)。毕竟,
constexpr
是一个声明说明符,如 inline
.这些变量引用的对象只是常量。
关于c++ - 在 C++ 中减少 `constexpr` 对象生命周期是否合法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68887614/