问题标签 [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.
c++ - consteval 函数中允许什么?
(对不起,如果这个问题太宽泛而无法回答)
(参见参考什么是 constexpr 函数中允许的?)
我知道constexpr
函数对它们允许的内容有一些限制。以下是引用列出它们。
函数体可能包含以下内容:
- asm 声明
- goto 语句
- 带有除 case 和 default 之外的标签的语句
- 一个尝试块
- 非文字类型变量的定义
- 静态或线程存储持续时间的变量的定义
- 不执行初始化的变量的定义
我想知道,对consteval
功能的限制与上面指定的有何不同。是否有一些东西可以在功能中允许consteval
但不能在功能中使用constexpr
,反之亦然。
c++ - 保持函数参数的 consteval-ness
我正在使用整洁的 fmt 库,如果编译器支持相关功能,它在其版本 8 中会对其格式字符串进行编译时检查。
在某些时候,我想编写以下代码:
可悲的是,天真的实现:
失败,因为这失去了字符串文字参数的“consteval-ness”,这是fmt::format
. 目前,我选择了以下内容:
被称为
如何在保持编译时检查的同时恢复正常的函数调用语法?
c++ - 使用 consteval 调用不断内联函数
我有一个 consteval crc32 函数,它在编译时工作得很好。我希望这个函数用于另一个常量内联函数。
下面是一个代码示例,以便更好地理解:
我希望这段代码编译为:
相反,我收到 C7595 错误:对 consteval 函数的调用不是常量表达式。
有没有办法在 MSVC 上实现想要的行为?
c++ - 是否可以在编译时通过代码创建动态列表并在运行时将其用作 const 数组?
我目前正在做一些工作,我想将尽可能多的代码抽象成一个简单的 api。基本上我想写这样的东西:
并让它在编译时创建必要的正则表达式(使用 CTRE)。
但是,当我需要匹配这些正则表达式时,我需要有一个它们的列表,以便我可以遍历它们并检查每一个。这已被证明是非常困难的。我尝试过的一件事是创建这样的东西:
但是,编译器抱怨说
不是常量表达式。
我不确定创建这样的列表是否可行,至少以我目前对标准库的了解是不可能的。
我可以通过让用户将处理程序作为一个完整的对象传递来做到这一点,也许可以这样做:
但我仍然想知道是否可以在编译时通过代码构造一个列表并循环遍历它,就好像它在运行时是一个 const 数组一样。
有任何想法吗?
c++ - 模板推导时,是否可以检测是否可以运行 consteval 函数
假设我们有一个consteval
函数或一个带有构造函数的普通结构,consteval
它只接受一些值:
有没有办法检测 int 的非类型模板参数是否可以被这样的构造函数接受?我尝试了以下代码但失败了。
c++ - 为什么 constexpr 不在编译时计算字符串文字?
输出是:
见https://godbolt.org/z/zMTq64MME
显然,strlen_1
不在编译时计算,而在编译时计算strlen_2
。
为什么 constexpr
不在编译时计算字符串文字?
c++ - 如何保证使用编译时间常数初始化堆栈变量
在 C++20 中,我们现在拥有constinit
. constexpr
和consteval
。
我现在可以保证静态变量是由 aconstexpr
或consteval
函数的结果初始化的constinit
。好的
我还可以保证使用consteval
在编译时执行的函数的结果来初始化堆栈变量。
但是如何强制运行一个constexpr
函数来计算编译时的结果以在堆栈上初始化一个变量?
如果我们使用constexpr
该变量是隐式的 const 并且constinit
在这里是不允许的。是否有机会使用函数的编译时间评估结果初始化此 var 而constexpr
不会使其成为 const?我只是想知道为什么constinit
仅限于静态变量。对我来说没有多大意义。
c++ - 可以从普通构造函数中调用“consteval”委托构造函数吗?
在以下结构定义中,构造函数A(int)
将其工作委托给立即函数构造函数A()
:
Clang 接受它,但没有 GCC 抱怨:
和 MSVC:
演示:https ://gcc.godbolt.org/z/7e3fWzYzr
哪个编译器是正确的?
c++ - constexpr 函数中的 Consteval 构造函数和成员函数调用
https://godbolt.org/z/hafcab7Ga
该程序被所有 GCC、Clang、MSVC 和 ICC 拒绝,并被替换为所有四个都接受它的constexpr
结果。g
consteval
但是,当删除呼叫时a.f();
,仍然使用constexpr
on g
,只有 ICC 仍然拒绝代码。其他三个现在接受它。
我不明白为什么会这样。我的理解是,没有consteval
on g
,表达式a.f()
不在直接函数上下文中,这将导致成员函数调用本身被评估为单独的常量表达式,然后无法修改i
成员,因为成员的生命周期在评估期间没有开始那个不变的表达。
但是为什么构造函数可以在同一个上下文中对同一个对象执行相同的操作呢?的生命周期是否a
被认为是在评估 consteval 构造函数期间开始的?
另请注意, 的存在static_assert
不会影响这些结果。constexpr
从那时起完全删除g
也不会改变编译器行为的任何内容。
正如@Enlico 所指出的,即使在除接受代码的ICC 之外的所有编译器中都替换A a;
和a.f();
替换A{}.f();
为constexpr
ong
结果,尽管据我了解,此表达式应导致对立即构造函数调用和立即成员函数的两个单独的常量表达式进行评估调用。我认为后一个调用的行为应该与 完全相同a.f();
,这使得这更加混乱。
(阅读@Barry 的回答后,我现在意识到最后一句话没有任何意义。更正:A{}
将是构造函数立即调用的一个常量表达式,并且A{}.f()
作为一个整体将是成员函数立即调用的第二个常量表达式。这显然与表达式不同a.f()
。)