gpt4 book ai didi

c++ - 在常量表达式上下文中定义之前的嵌套 `constexpr` 函数调用

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:21:53 24 4
gpt4 key购买 nike

根据我从 this answer 收集到的信息, 如果函数尚未声明,则 constexpr 函数的结果不是常量表达式。令我惊讶的是以下代码片段:

constexpr int f();

constexpr int g() {
return f();
}

constexpr int f() {
return 42;
}

int main() {
constexpr int i = g();
return i;
}

这个编译没有问题并且可以工作。将 f 的定义移动到主触发器之后 error: 'constexpr int f()' used before its definition,如我所料。

我认为它可以工作,因为 f 已在调用 g 之前定义,因此这两个调用都是常量表达式。

为什么 f()g() 显然是常量表达式,即使 f 在调用时没有定义g?标准是如何描述的?

我已经在 Coliru 的 GCC 6.1.0 和 Clang 3.8.0 上对此进行了测试。

最佳答案

使用constexpr 之前不需要定义它。但是,在定义之前调用它的结果不是 constexpr。因此,编译器会合理地提示,因为您试图用非常量表达式初始化 constexpr 变量。

§5.20/p2 常量表达式 [expr.const](强调我的):

A conditional-expression e is a core constant expression unless the evaluation of e, following the rules of the abstract machine (1.9), would evaluate one of the following expressions:

...

(2.3) — an invocation of an undefined constexpr function or an undefined constexpr constructor;

关于c++ - 在常量表达式上下文中定义之前的嵌套 `constexpr` 函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37526366/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com