You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中所有可重入函数是否均可重构为constexpr函数?

2023年10月10日06:30 UTC 更新:

感谢@DrewDormann、@Solomon Slow、@Pepijn Kramer和@user17732522的宝贵评论,我意识到此前的问题考虑不够周全,现补充说明。

对于可重入函数,其结果似乎仅由参数决定。若参数为常量,理论上可在编译期确定结果,这也是我探讨可重入函数与constexpr函数关系的原因。

但我此前对“常量参数”的假设存在错误:非类型模板参数确实是常量,但常量参数并非必须是模板参数。

针对std::string参数类型,最新C++标准中有如下constexpr函数示例:

#include <iostream>
#include <string>
using namespace std;

constexpr string say_hello(string x) { return "Hello, "s + x; }

int main()
{
    cout << say_hello("World") << endl;
    return 0;
}

那么,C++中所有可重入函数是否均可重构为constexpr函数?

感谢大家对原问题的评论与解答。


原问题

C++中所有可重入函数是否均可重构为constexpr函数模板?

我了解到C语言中,函数需满足以下规则才被视为可重入:

  • 函数内不使用静态或全局变量,因为函数恢复执行时这些变量可能已被修改
  • 函数不得修改自身代码(例如部分底层图形例程可能会自行生成代码)
  • 不得调用不符合上述两条规则的函数

C++中也适用类似原则。我注意到constexpr函数的规则与之相似。

对于如下可重入函数:

float f(float x) { return x*x; }

在C++20中可重构为constexpr函数模板:

template <float X> constexpr float f() { return X*X; }

这是一个简单示例,但在更复杂的场景下,此类重构是否始终可行?换言之,C++中所有可重入函数是否均可重构为constexpr函数模板?

内容的提问来源于stack exchange,提问作者yqZhang4480

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 04:07:36