c++ - 在 C++ 中减少 `constexpr` 对象生命周期是否合法?

标签 c++ language-lawyer constexpr explicit-destructor-call

对于普通对象(即使是 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/

相关文章:

c++ - 如何在 cv::cuda::PtrStepSzf 数据上使用线性索引

c++ - 在 C++ 中创建密码

c++ - 如何在类层次结构中找到两个类的共同父类

c++ - 静态 opencv 在 arm Linux busybox 上找不到 USB 网络摄像头?

c++ - 虚拟表创建线程安全吗?

c++ - 数组到指针转换期间的临时物化

c++ - 从 C++14 模板特化中删除 constexpr?

c++ - 局部常量变量不是 constexpr 可评估的,但无法弄清楚为什么

c++ - std::basic_string 是否正式具有隐式生成的 move 构造函数?

c++ - 在 C++14 中,constexpr 成员可以更改数据成员吗?