考虑到 C++23 对 constexpr 的放宽,constexpr 不能成为默认值吗?

问题描述 投票:0回答:1

关键字 constexpr 在引入 C++11 标准时对其函数施加了相当严格的限制。 C++14 和 C++20 放宽了这些限制(最值得注意):

  • C++14 允许多个
    return
    语句、
    static_assert
    等。
  • C++20 允许
    try
    asm

C++23 进一步软化了这些限制。从我在cppreference中看到的,函数的

constexpr
似乎只剩下以下含义:

  • 它一定不是协程
  • 对于构造函数和析构函数,该类必须没有虚拟基类
  • 对于 constexpr 函数模板和类模板的 constexpr 成员函数,至少一项特化必须满足上述要求。

C++23 甚至删除了 constexpr 函数必须在编译时对于 p2448r2 中的任何类型“可计算”的限制。根据我的理解,这完全消除了在编译时评估

constexpr
函数的想法。

是这样吗?如果是这样,

constexpr
函数还有用吗?

c++ constexpr language-design c++23 constexpr-function
1个回答
10
投票

您实际上似乎在问:为什么不默认制作任何东西

constexpr

因为您可能希望其他人在编译时不要使用函数,以便您稍后可以切换到非 constexpr 实现。

想象一下:

  • 您会看到一个库函数,您想在编译时使用它。

    比方说,

    size_t RequiredBufferSize();
    。如果它恰好是 constexpr,您可以在堆栈上分配缓冲区,或者类似的东西。

  • 你不确定它是否应该在编译时工作,因为我们想象的语言中没有

    constexpr

  • 你尝试一下,它确实在编译时起作用。你开始这样使用它。

    假设实现是

    {return 42;}
    ,即
    constexpr

  • 库的新版本发布,该函数在编译时不再起作用(例如,大小是从配置文件加载的)。

  • 您向开发人员抱怨,他认为该函数从未打算在编译时工作,并且您依赖于实现细节。

© www.soinside.com 2019 - 2024. All rights reserved.