- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这可能是一个愚蠢的问题,但我很困惑。我有一种感觉,立即(consteval
)函数必须在编译时执行,而我们根本无法在二进制文件中看到它的主体。
This article明显支持我的感觉:
This has the implication that the [immediate] function is only seen at compile time. Symbols are not emitted for the function, you cannot take the address of such a function, and tools such as debuggers will not be able to show them. In this matter, immediate functions are similar to macros.
类似的强烈主张可能会在 Herb Sutter's publication 中找到。 :
Note that draft C++20 already contains part of the first round of reflection-related work to land in the standard: consteval functions that are guaranteed to run at compile time, which came from the reflection work and are designed specifically to be used to manipulate reflection information.
但是,有许多证据并不那么清楚地证明这一事实。
来自cppreference :
consteval - specifies that a function is an immediate function, that is, every call to the function must produce a compile-time constant.
这并不意味着它必须仅在编译时调用。
There is now general agreement that future language support for reflection should use constexpr functions, but since "reflection functions" typically have to be evaluated at compile time, they will in fact likely be immediate functions.
好像是这个意思,但还是没说清楚。来自同一提案:
Sometimes, however, we want to express that a function should always produce a constant when called (directly or indirectly), and a non-constant result should produce an error.
同样,这并不意味着该函数必须仅在编译时进行评估。
来自this answer :
your code must produce a compile time constant expression. But a compile time constant expression is not an observable property in the context where you used it, and there are no side effects to doing it at link or even run time! And under as-if there is nothing preventing that
最后,there is a live demo ,其中 consteval 函数显然是在运行时调用的。但是,我希望这是由于 clang 中尚未正确支持 consteval 且行为实际上是不正确的,就像 Why does a consteval function allow undefined behavior? 中那样。
更准确地说,我想听听所引用文章的以下哪些陈述是正确的:
最佳答案
To be more precise, I'd like to hear which of the following statements of the cited article are correct:
- An immediate function is only seen at compile time (and cannot be evaluated at run time)
- Symbols are not emitted for an immediate function
- Tools such as debuggers will not be able to show an immediate function
这些几乎都不是 C++ 标准能够给出的答案。该标准没有定义“符号”或可以显示哪些工具。就标准而言,几乎都是经销商的选择。
事实上,甚至“编译时”与“运行时”的问题也是标准没有处理的。与标准有关的唯一问题是某物是否是常量表达式。调用 constexpr
函数可能生成一个常量表达式,具体取决于其参数。以不产生常量表达式的方式调用 consteval 函数是错误格式的。
标准所做定义的一件事是“看到”的内容。虽然这并不是真正的“编译时间”。 C++20 中有许多语句禁止大多数函数处理对立即函数的指针/引用。例如,C++20 在 [expr.prim.id]/3 中声明:
An id-expression that denotes an immediate function shall appear only
as a subexpression of an immediate invocation, or
in an immediate function context.
因此,如果您不在立即函数中,或者您没有使用立即函数的名称来调用另一个立即函数(传递对该函数的指针/引用),则无法命名立即函数。如果不命名函数,您就无法获得指向该函数的指针/引用。
规范中的此语句和其他语句(如 pointers to immediate function not being valid results of constant expressions )本质上使得对立即函数的指针/引用不可能泄漏到常量表达式之外。
因此,关于立即函数可见性的陈述在某种程度上是正确的。符号可以为立即函数发出,但是您不能以阻止实现丢弃所述符号的方式使用立即函数。
这基本上就是 consteval
的事情。它不使用标准语言来强制执行必须发生的事情。它使用标准语言使得无法以防止这些事情发生的方式使用该函数。所以更合理的说法是:
使用立即函数的方式不能阻止编译器在编译时执行它。
使用立即函数时不能阻止编译器丢弃其符号。
您不能以强制调试器能够看到它们的方式使用即时函数。
预计实现质量将从那里开始。
还应该注意的是,调试构建是为了......调试。高级编译器工具能够调试生成常量表达式的代码是完全合理的。因此,可以立即执行函数的调试器是一项完全理想的技术。随着编译时代码变得更加复杂,这种情况变得更加严重。
关于c++ - 编译器是否允许在运行时调用立即(consteval)函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58466245/
我希望在我的应用程序下载信息时显示 Toast 消息,但即使我将它放在我的代码之前,它也不会在下载完成后出现。将我的代码放在一个单独的线程中会引起很多麻烦,但是将 toast 放在一个单独的线程中也不
面临即时应用更新模式的问题。成功完成应用程序更新后,一切都关闭并且不重新启动应用程序。这就是问题所在。 但是android文档说: A full screen user experience that
我有一张 table 我有一个 anchor 标记,
我正在开发一个具有两个线程的 Java/Seam/Hibernate/Glassfish 应用程序: 线程 #1 发送各种消息并将摘要信息写入 MySQL 数据库。 线程 #2 定期轮询数据库(由 S
我找不到规范的相关部分来回答这个问题。在 Java 中的条件运算符语句中,是否同时评估真假参数? 以下是否会抛出 NullPointerException Integer test = null; t
大家下午好, 我想知道是否有办法使类的静态 block 运行,即使类本身没有被引用? 我知道它是延迟加载的,因此只需调用该类的任何函数即可开始启动该类, 但是,我希望该类在任何调用之前启动,换句话说,
我正在尝试使用 jQuery prop() 方法禁用元素(表单字段)。有两个字段,一个叫做fee,一个叫做currency。每当 fee 设置为 0 时,第二个字段 currency 将被禁用。这样做
我想为 UIButton 的缩放设置动画,并在完成后再次为缩放设置动画,但让它在没有动画的情况下旋转。我尝试将旋转变换放在没有持续时间的动画调用中,但不知何故它仍然成为缩放动画的一部分或替换缩放动画。
在 js 代码中,我创建了 3 个按钮 --- 按钮 1...按钮 2...按钮 3和 3 个输入字段 --- 输入字段 1...输入字段 2...输入字段 3 从脚本开始所有按钮都被禁用 只有当输入
我正在使用一个 threading.Thread() 来完成它的工作并返回 。它的返回记录在打印语句中,所以我确信有时候是这样的。然而,依靠 threading.active_count() 和 th
我正在使用 IntelliJ 9,我很好奇是否有任何与 Visual Studio“即时”调试窗口等效的 IntelliJ。在编辑器中选择所需的表达式,然后 ALT-F8 来评估表达式,但我希望能够在
我有一个两个标签页,一个标签是记录列表,点击记录会切换到编辑标签,编辑标签中有保存和取消按钮。 现在,我单击记录 #1,进行一些编辑,然后单击取消按钮。当然我不想验证表单,因为它被取消了,所以我设置了
我有一个 A viewController,首先,我呈现 B viewController,经过一些工作后,我需要关闭 B viewController 并呈现 C viewController,所以
我希望能够在文本框中输入内容,当用户在文本框中输入内容时,我希望程序无需单击按钮即可自动读取文本框。 例子:用户类型:“abcd”当用户输入时,程序会显示每个字母对应的数字。 程序输出:“1234”
如果任何表单输入发生更改,如何立即更改提交按钮文本? //This applies to whole form $('#test').change(function() { $("#send").
主要功能: var interval; function refreshId(sessio
假设我有一个包含这些列的 data.table nodeID hour1aaa hour1bbb hour1ccc hour2aaa hour2bbb hour2ccc .
根据vimeo js-api doc ,事件 finish - 当视频播放结束时触发。 出于某种原因,我无法让它工作,finish 事件总是立即调用,我做错了什么吗? 我试图让嵌入的视频在播放完毕后消
我想滑动当前ul元素下的所有li元素和slideDown li元素 $(document).ready(function(){ $("li").slideUp(); }); $(".nav")
我有一个表-compositeView,其中有行-itemView。每行都有许多事件 - 单击、更改等等。 在某些状态下,我想“锁定”表。禁用按钮并取消事件。 是否有一种好方法可以立即取消 itemv
我是一名优秀的程序员,十分优秀!