【问题标题】:Is it possible to ensure a constexpr function is called at most once at compile time?是否可以确保在编译时最多调用一次 constexpr 函数?
【发布时间】:2017-06-15 20:01:38
【问题描述】:

正如标题所问:是否可以确保 constexpr 函数在编译时最多被调用一次?

如果函数不是ConderepXR,则这显然不会有可能;我可以编写一个在我按下空格键时调用的函数,因此编译器在编译时永远无法解决这个问题。

【问题讨论】:

  • constexpr 表达式/函数没有副作用,因此它们被调用的频率并不重要(运行时/性能除外)。那么你为什么要确保只评估一次consexpr? span>
  • @WernerHenze “那么你为什么要确保一个 constexpr 只被评估一次呢?”只是好奇心,找到语言的界限: - ) span>
  • @rwols:问题是“只调用一次”对于constexpr 函数在编译时是一个毫无意义的概念。它可能实际上被称为一个半时间(!) - 实现可以缓存 constexpr 表达式的评估,这可以包括部分缓存。
  • 如果你使用预编译的头文件并在头文件中运行constexpr函数为:constexpr auto result = function(args...);,那么,也许编译器只会计算一次

标签: c++ c++11 c++14 c++17 c++20


【解决方案1】:

简短回答: 不,因为constexpr 函数无法读取/设置外部状态。 (它们可以有内部状态,但它们仍然需要“纯”)


真正的答案:可能是的,但这是个坏主意。 Filip Roséen 有一系列博客文章,其中涵盖了通过滥用 friendship 和 ADL 来实现有状态的 constexpr 函数:

这项技术非常神秘和复杂。 CWG which is trying to make it ill-formed with issue #2118 认为这是对功能的滥用。

【讨论】:

  • 这三篇文章很好读,所以我要+1!您可能是对的,没有人应该使用这些技术。
  • 链接已失效
  • @underscore_d:谢谢,希望他们很快就会回来。添加了谷歌缓存链接
猜你喜欢
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 2019-11-26
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
  • 1970-01-01
相关资源
最近更新 更多