【问题标题】:What is the use of a constexpr function in C++23?C++23 中的 constexpr 函数有什么用?
【发布时间】:2023-01-23 23:53:33
【问题描述】:

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

  • C++14 允许多个return 语句、static_asserts 等。
  • C++20 允许 tryasm

C++23 进一步放宽了这些限制。从我在cppreference中看到的,函数的constexpr似乎只剩下以下含义:

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

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

是吗?如果是这样,constexpr 函数还有什么用?

【问题讨论】:

  • 它可以在编译时评估吗?
  • @user253751 给定“as-if”子句,none constexpr 函数也可以。另见 p2448r2:open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2448r2.html
  • 实际上,如果你的函数是 constexpr 那么编译器会承诺它将要如果可能的话,在编译时对其进行评估,否则它只会做出微弱的尝试。这是语言律师的问题吗?
  • 不要再认为 constexpr 限制指定了一组功能,它已被更大的一组所取代。所做的更改没有使任何用户提供的函数constexpr 没有被程序员标记。相反,constexpr 关键字定义了一组函数,并且语言更改放宽了对如何在内部实现这些函数的限制。
  • 我想你的意思是要问:为什么我们仍然需要将函数注释为 constexpr,而不是“constexpr 函数有什么用?” (显而易见的答案是:在编译时评估代码非常有用?)

标签: c++ constexpr c++23 constexpr-function


【解决方案1】:

您实际上要问的是:为什么不默认创建任何constexpr

因为您可能希望人们在编译时不使用某个函数,以便您以后有可能切换到非 constexpr 实现。

想象一下:

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

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

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

  • 您尝试一下,它确实在编译时起作用。您开始以这种方式使用它。

    假设实现是{return 42;},即constexpr

  • 发布了新版本的库,该函数在编译时不再有效(例如,大小是根据运行时配置计算的)。

  • 您向开发人员投诉,他争辩说该函数从未打算在编译时运行,并且您依赖于实现细节。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 2017-05-27
  • 2015-02-12
  • 1970-01-01
  • 2021-02-20
  • 2015-10-13
  • 2021-07-25
相关资源
最近更新 更多