【问题标题】:What is consteval?什么是 consteval?
【发布时间】:2019-04-20 04:47:08
【问题描述】:

显然,consteval 将成为 C++20 中的关键字。它的cppreference page 当前为空白。它将是什么以及它与constexpr 有什么关系?

【问题讨论】:

  • “显然,consteval 将成为 C++20 中的一个关键字”——提供一个链接来支持这个断言。
  • @NeilButterworth 我已经链接到的 cppreference 页面声称它是。
  • decltype(std::declval<f()>)'ish 但是..有趣的东西。
  • @NeilButterworth:根据这个推理,没有人甚至可以称它为“C++20”,或者说甚至会成为 C++ 的下一个版本。在各种会议上询问已根据 WG21 程序批准的即将推出的功能并不是没有道理的。喜欢the most recent one.

标签: c++ c++20 consteval


【解决方案1】:

它声明了立即函数,即必须在编译时求值以生成常量的函数。 (在论文的先前版本中,它曾经拼写为 constexpr!。)相反,constexpr 函数可以在编译时或运行时进行评估,并且在所有情况下都不需要生成常量。

采用的论文是P1073R3,尚未公开,但a previous revision 可用,介绍性(动机和高级描述)部分大致相同(除了“源位置”部分是在 R3 中删除)。

【讨论】:

  • 不,你不能,就像constexpr
  • 可能值得指出的是,其动机是让函数依赖于不需要保存在二进制文件中的编译器数据结构。
  • @geza 您不需要,但您可以通过使用 noexcept 运算符(对于 msvcgcc)或通过__builtin_constant_p 运算符(用于 clanggcc)。阅读这些以了解详细信息:* stackoverflow.com/questions/13299394/… * reddit.com/r/cpp/comments/7c208c/…
  • 这是否意味着 consteval 函数在运行时不可用?
  • 没错,@MarcusJ,consteval 函数在运行时不可用,因为除非在编译时知道它们的所有参数,否则无法调用它们。当然,如果这是真的,编译器可以(在编译时)找出这些例程返回的内容,而无需实际为它们生成代码。
猜你喜欢
  • 2021-10-26
  • 2021-02-20
  • 2021-09-13
  • 2020-02-15
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-31
相关资源
最近更新 更多