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
相关产品推荐
相关产品推荐

