首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >常量表达式与纯函数的关系

常量表达式与纯函数的关系
EN

Stack Overflow用户
提问于 2011-03-29 00:56:40
回答 4查看 2.9K关注 0票数 22

我说的对吗,那就是:

  • 任何用constexpr定义的函数都是pure function
  • 任何纯函数都可以而且必须用constexpr定义,前提是它对编译器来说不是很昂贵。

如果是这样,为什么<cmath>的函数不是用constexpr定义的?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-03-29 01:09:22

为了补充其他人所说的内容,请考虑以下constexpr函数模板:

代码语言:javascript
复制
template <typename T>
constexpr T add(T x, T y) { return x + y; }

constexpr函数模板在某些情况下可在常量表达式中使用(例如,在Tint的情况下),但在其他情况下不可用(例如,T是具有未声明为constexproperator+重载的类类型)。

constexpr并不意味着函数在常量表达式中总是可用的,它意味着函数可以在常量表达式中使用。

(还有涉及非模板函数的类似示例。)

票数 18
EN

Stack Overflow用户

发布于 2011-03-29 01:29:09

除了前面的回答:函数上的constexpr极大地限制了它的实现:它的主体必须对编译器可见(内联),并且只能由一条返回语句组成。如果您能够正确地实现sqrt()或sin(),并且仍然满足最后一个条件,我会感到惊讶。

票数 10
EN

Stack Overflow用户

发布于 2011-03-29 03:35:43

constexpr函数不是pure函数,因为constexpr是对编译器的一个提示,即如果函数的参数是常量,则可以在编译期间计算函数,并且函数体中提到的这些参数的操作本身就是constexpr

后者使用模板代码,允许我们演示一个不纯的constexpr函数:

代码语言:javascript
复制
template <typename T>
constexpr T add(T lhs, T rhs) { return lhs + rhs; }

使用此类型实例化

代码语言:javascript
复制
DebugInteger operator+(DebugInteger lhs, DebugInteger rhs) {
  printf("operator+ %i %i", lhs._value, rhs._value);
  return DebugInteger(lhs._value + rhs._value);
}

这里,operator+不是常量Here,因此可以读/写全局状态。

我们可以说,当在编译时计算时,constexpr函数是pure ...但就运行时而言,它只是简单地被一个常量替换。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5462388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档