问题标签 [consteval]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
191 浏览

c++ - consteval 包装器与 source_location

我在 C++20 模式下使用 GCC10 尝试了以下第一个变体:

我期望以下输出:

但我得到了:

然后我尝试了以下第二个变体:

我期望以下输出:

但我得到了:

为什么代码会这样?有没有办法让它在不使用预处理器宏的情况下按预期运行?

更新:使用 'constexpr' 或 'inline' 而不是 'consteval' 的第二个变体适用于最新的 GCC。所以剩下的问题是:为什么“consteval”不能正常工作?有人告诉我这不是一个标准问题,而是一个实施主题,所以我将把这个问题重新标记为 GCC。

0 投票
1 回答
176 浏览

c++ - consteval 如何影响默认参数的评估?

在下面的代码中,如果here()停止存在consteval(完整的 RT 或constexpr),则为insideline()的调用行。但有了它的定义。这种差异从何而来?f()main()constevalf()

螺栓链接

0 投票
0 回答
862 浏览

c++ - 什么时候使用 constinit 和 consteval?

的用法constexpr非常简单,即确保可以在编译时评估代码本身。

但是 C++ 20 的最新特性提供constinit并且consteval有点令人困惑。constinit有人可以提供and的实际用例consteval吗?

0 投票
1 回答
203 浏览

c++ - 有没有办法在 constexpr/consteval 上下文中访问已知大小的任意数据作为 char 数组?

我正在尝试实现一些将接收任意位数据(在编译时已知)并将它们的 CRC 计算为 a 的consteval东西,因此我可以使用它来例如用整数键索引此类数据,而无需任何运行时开销。当输入是字符字符串文字时,我让它工作,但是当输入是字符串文字时,我正在努力让它工作wchar_t

我收到一个相当神秘的错误......

error: accessing value of '"T\000e\000s\000t\000\000"' through a 'const char' glvalue in a constant expression

...这似乎是由在 constexpr 上下文中使用 reinterpret_cast 引起的(这显然是不允许的)

我的问题是,有没有办法将任意数据解释为普通的旧字节数组?我不在乎它有多丑陋或缺乏可移植性(只要这一切都发生在编译时)。现在,只需使用数组wchar_t作为输入来解决这个问题就足够了。显然,我可以“只是”为我想单独处理的每种类型重新实现 CRC 计算,但如果可能的话,我宁愿不这样做(事实上,对于比 POD 数组更复杂的任何事情,这将非常棘手)

作为参考,失败的代码如下:

0 投票
2 回答
1100 浏览

c++ - clang 说调用 void consteval 函数不是常量表达式

clang(trunk) 给出以下代码的错误:

而 gcc(trunk) 编译它没有错误。

我觉得这可能是一个 clang 错误,因为 gcc 和 clang 都接受这个代码:

这是要玩的代码。

那么这是一个clang错误,还是代码格式错误,或者有ub,或者其他什么?


编辑:我觉得有必要指出 clang 允许f从其他函数调用,如果它们也是 consteval 的话。它仅在f从非 consteval 函数调用时给出错误:

演示

0 投票
1 回答
85 浏览

c++ - 为什么 constexpr 函数不能使用 consteval 函数,而您可以从 consteval 函数创建 constexpr 对象?

您可以在 consteval 中使用 constexpr 对象,但不能在 constexpr 中使用 consteval。

为什么?

我认为 consteval 应该是某种“狭义”的 constexpr。

请帮助我理解这个设计。

[直播]

0 投票
1 回答
570 浏览

c++ - C++ 中的编译时调试

在这条准则下constexpr everything,随着constevalC++20 的引入,越来越多的代码在编译时被评估。

这就引出了一个明显的问题:我们如何调试它?

目前,唯一的提示是编译器错误。但是如果代码编译了,但仍然没有达到预期的效果怎么办。有什么工具可以帮助解决这个问题吗?有什么检查的可能吗?

一个相关的问题是:如何知道哪些会在编译时真正“执行”,哪些会在运行时保留,尽管有限定符。

0 投票
1 回答
1211 浏览

c++ - consteval vs constexpr 变量

constexpr和有什么区别consteval吗?

使用 constexpr 比使用 consteval 更好吗?

0 投票
1 回答
577 浏览

c++ - 使用 consteval 代替 constexpr 函数有什么好处?

我知道需求的差异,我最感兴趣的是它带来的代码质量的好处。

我能想到的几件事:

  • 读者可以只阅读函数签名并知道该函数是在编译时评估的
  • 编译器可能会发出更少的代码,因为consteval在运行时从不使用 fns(这是推测性的,我没有这方面的真实数据)
  • 不需要有变量来强制ctfe,最后的例子

注意:如果代码质量太模糊,我知道有些人可能想结束这个问题,对我来说,代码质量并不是那么模糊的术语,但是......

constexpr失败延迟到运行时的示例

0 投票
1 回答
130 浏览

c++ - decltype(fun()) 用于 consteval 方法

考虑以下代码。我可以用 GCC 10.2.0 和 Clang 11.0.0 编译它(如预期的那样):

如果我替换constexprconsteval,那么 Clang 会抱怨std::remove_cvref_t<decltype(fun())>

错误:不能在立即调用之外获取 consteval 函数 'fun' 的地址

GCC 编译它就好了。为什么?