gpt4 book ai didi

c++ - `constexpr` 函数可以在 C++ 中前向声明吗?

转载 作者:行者123 更新时间:2023-12-04 11:10:59 25 4
gpt4 key购买 nike

我可以申报 constexpr在给出定义之前在 C++ 中的函数?
考虑一个例子:

constexpr int foo(int);
constexpr int bar() { return foo(42); }
constexpr int foo(int) { return 1; }

static_assert(bar() == 1);
实际上所有编译器都支持,demo: https://gcc.godbolt.org/z/o4PThejso
但是如果转换函数 foo在模板中:
constexpr int foo(auto);
constexpr int bar() { return foo(42); }
constexpr int foo(auto) { return 1; }

static_assert(bar() == 1);
然后 Clang 拒绝接受,说 https://gcc.godbolt.org/z/EG7cG9KTM :
<source>:5:15: error: static_assert expression is not an integral constant expression
static_assert(bar() == 1);
^~~~~~~~~~
<source>:2:30: note: undefined function 'foo<int>' cannot be used in a constant expression
constexpr int bar() { return foo(42); }
^
<source>:5:15: note: in call to 'bar()'
static_assert(bar() == 1);
它仍然是有效的 C++ 代码还是 Clang 错误?

最佳答案

这是核心问题 2166 .

Section: 7.7 [expr.const] Status: drafting Submitter: HowardHinnant Date: 2015-08-05

According to 7.7 [expr.const] bullet 2.3, an expression is a constantexpression unless (among other reasons) it would evaluate

an invocation of an undefined constexpr function or an undefinedconstexpr constructor;


这并没有解决 constexpr 在哪个点的问题
必须定义函数。意图,为了让
相互递归的 constexpr 函数,是该函数必须是
在最终导致的最外层评估之前定义
调用,但这没有明确说明。

换句话说,标准在这种情况下不清楚,所以每个编译器都可以自由地接受或拒绝它认为合适的代码。
在 Clang 的情况下,一个 auto参数是通过将函数转换为模板来实现的。这使得编译器更难以维护 constexpr 上下文。这并不是说不可能实现(毕竟GCC没问题),只是在2166解决之前不是bug。
同时,您可以通过制作 bar() 来获得要编译的代码。也是一个模板,或者删除 auto来自 foo() .

关于c++ - `constexpr` 函数可以在 C++ 中前向声明吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68609139/

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