这可能是一个愚蠢的问题,但我很困惑。我有一种感觉,即在编译期间必须执行一个立即 ( )consteval
函数,而我们根本无法在二进制文件中看到它的主体。
这篇文章显然支持了我的感觉:
这意味着 [immediate] 函数仅在编译时可见。该函数不会发出符号,您无法获取此类函数的地址,并且调试器等工具将无法显示它们。在这个问题上,立即函数类似于宏。
在Herb Sutter 的出版物中可以找到类似的强烈主张:
请注意,C++20 草案已经包含了第一轮反射相关工作的一部分,这些工作将被纳入标准:保证在编译时运行的consteval 函数,它来自反射工作,专门设计用于操纵反射信息。
然而,有许多证据对这一事实并不十分清楚。
consteval - 指定一个函数是一个立即函数,也就是说,对函数的每次调用都必须产生一个编译时常量。
这并不意味着它只能在编译时调用。
来自P1073R3 提案:
现在普遍认为,未来语言对反射的支持应该使用 constexpr 函数,但由于“反射函数”通常必须在编译时进行评估,它们实际上很可能是即时函数。
似乎这意味着我的想法,但仍然没有说清楚。来自同一个提案:
然而,有时我们想表达一个函数在调用时(直接或间接)应该总是产生一个常量,而一个非常量的结果应该产生一个错误。
同样,这并不意味着函数必须仅在编译时进行评估。
从这个答案:
您的代码必须生成编译时常量表达式。但是编译时常量表达式在您使用它的上下文中不是可观察的属性,并且在链接甚至运行时执行它没有副作用!好像没有什么可以阻止
最后,有一个现场演示,其中consteval
函数在运行时被清楚地调用。但是,我希望这是因为consteval
在 clang 中还没有得到适当的支持,并且行为实际上是不正确的,就像在为什么 consteval 函数允许未定义的行为?
更准确地说,我想听听引用文章的以下哪些陈述是正确的:
- 立即函数仅在编译时可见(不能在运行时评估)
- 不为立即函数发出符号
- 调试器等工具将无法显示即时功能