gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:32:28 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com