【问题标题】:In which practical case is "const constinit" useful?在哪种实际情况下“const constinit”有用?
【发布时间】:2021-09-14 08:31:52
【问题描述】:

@Vittorio Romeothis 问题的回答很好地解释了constinit。在他的回答中,提到了以下内容:

constexpr 不等同于const constinit,因为前者要求持续销毁,而后者则没有。

虽然很清楚,但我看不到它有任何实际用途。在这种情况下将使用const constinit,但不能使用constexpr。在我能想到的任何情况下,对于可以是 constinit 并且在运行时无法通过 const 更改的任何类型 T常量破坏 应该是一个微不足道的限制添加。我错过了什么吗?

【问题讨论】:

  • 如果你有一个你不能改变的类型并且析构函数不是 constexpr?前几天我也遇到过类似的情况,幸运的是我控制了析构函数的代码并且可以更改它。
  • @bitmask 所以这可能有用的唯一情况是如果你不能更改类型T?
  • 我的意思是,为什么 dtor 是非 constexpr 而 ctor 是有正当理由的。我就是想不出一个。
  • 也许有些构造函数是 constexpr,但其他函数/ctors 不能是(并且正在分配资源),那么析构函数必须是非 constexpr?
  • @Brotcrunsher:需要有一个用例吗?为什么要在标准中添加语言来阻止人们使用特定的限定词组合,仅仅因为其他一些限定词可能更适合他们?

标签: c++ constants c++20 constinit


【解决方案1】:

如果您对外部代码有依赖而无论出于何种原因都无法更改,它看起来像这样

struct A {
  ~A() {}
};

这意味着A 不是文字类型,因为它没有constexpr 析构函数(很可能是疏忽)。但是它可以在编译时构建,因此是 constinit

【讨论】:

    【解决方案2】:

    一个可能的实际案例:

    struct AtExit
    {
        ~AtExit() { std::cout << "End"; }
    };
    

    Demo

    (使用仿函数模板类更有用)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-14
      • 2023-03-12
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-17
      相关资源
      最近更新 更多