gpt4 book ai didi

c++ - 嵌套 conexpr 函数错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:28:15 25 4
gpt4 key购买 nike

以下代码无法使用 g++/clang++ 进行编译。

constexpr int bar(int v) {
if (v > 0){
return v * 2;
}
return 2;
}

constexpr int foo(const int v) {
constexpr auto x = bar(v); // error
return v;
}

int main() {
constexpr auto a = foo(1);
constexpr auto b = bar(1); // ok
}

错误信息是:x must be initailized by a constant expression

但是从行 (ok) 可以看出 bar() 是 constexpr。

如果我将 foo() 的主体更改为

constexpr int foo(const int v) {
return bar(v);
}

没关系!

我不太清楚,为什么第一种形式不可能。我使用了 g++-6.2.1、g++-7.0.0 和 clang++-3.9.0

最佳答案

修复是这个

constexpr int foo(const int v) {
auto x = bar(v);
return v;
}

关键字 constexpr 意味着两个非常不同的东西。 constexpr 变量必须在编译时求值,而 constexpr 函数必须可以在编译时求值。没有什么可以阻止您在运行时调用 foo 。这意味着……

  1. 参数 v 不一定是 constexpr。
  2. 当用 b 调用 bar 时,答案可能不是 constexpr。
  3. 的结果不能存储在 constexpr 变量中,因为它可能不是 constexpr。

如果在编译时调用 foo,则不会存储 x,它是编译器中的临时变量,因此将其设为 constexpr 没有任何意义。

只有在运行时计算 foo 时,x 的 constexpr'ness 才有意义,在这种情况下它不能是 constexpr,这会导致错误。

关于c++ - 嵌套 conexpr 函数错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40690468/

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