gpt4 book ai didi

c++ - constexpr 递归函数是否使用 if constexpr

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:34:39 32 4
gpt4 key购买 nike

使用 gcc (HEAD 7.0.0 201612) 我惊讶地发现这有效:

constexpr long value(const char *definition)
{
if (definition && *definition)
{
return *definition + value(definition + 1);
}

return *definition;
}

int main()
{
long l{};
std::cin >> l;

switch (l)
{
case value("AAAA"): f1(); break;
case value("BBBB"): f2(); break;
default: error(); break;
}

return 0;
}

文字字符串 "AAAA""BBBB" 被视为编译时值,调用 value 函数产生值260264 直接在switch 上下文中使用;我应该承认,我原以为编译器会提示“字符串不是常量表达式”。所以我进入下一步并尝试将 if constexpr 添加到算法中:

constexpr long value(const char *definition)
{
if constexpr (definition && *definition)
{
return *definition + value(definition + 1);
}

return *definition;
}

但是通过添加 if constexpr 代码不再编译:

In function 'constexpr long int value(const char*)':
error: 'definition' is not a constant expression
if constexpr (definition && *definition)
^

所以看起来 definition 指针本身在编译时在 if constexpr 上下文中是不可评估的,而是使用传统的 if 整个函数在编译时可评估。

为什么会这样?

最佳答案

发生这种情况的原因与您不能这样做的原因相同:

constexpr auto func(const int foo)
{
return std::array<int, foo>{};
}

foo 可能是也可能不是常量表达式,这取决于您如何调用 func。但是你放入模板参数中的内容必须是一个常量表达式。因此,这段代码编译失败。

您的 value 函数也是如此。您放入if constexpr 的内容必须 是常量表达式,就像模板参数一样。所以你不能在那里放一些可能是也可能不是常量表达式的东西,比如 constexpr 函数的参数。

关于c++ - constexpr 递归函数是否使用 if constexpr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41266275/

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