C 11 引入了 constexpr 说明符,使函数能够在常量表达式中使用。尽管对函数行为提出了严格的要求,但它提供了一个至关重要的好处。
考虑一个库函数最初返回一个常量的场景,如图所示在 Awesome_lib.hpp 中:
inline int f() { return 4; }
如果没有 constexpr,客户端代码可以使用此函数来实现需要编译时常量的目的,例如模板参数或数组维度。
#include#include std::array ; // needs CT template arg int my_c_array[f()]; // needs CT array dimension
但是,如果 f() 的实现更改为从配置文件中检索其值,则此客户端代码将会中断。此更改将在客户端编码人员不知情的情况下有效地改变接口的使用。
通过将函数标记为 constexpr,程序员承认客户端代码可以合理地预期其恒定性质。这确保了库函数的使用不会因实现更改而受到影响。编译器强制执行此期望,保证客户端代码不依赖于非常量函数。
类似于 const 说明符对于成员函数,constexpr 说明符可防止客户端代码依赖将来可能不可用的功能。然而,它们的执行机制有所不同。
const 说明符确保常量成员函数中的其他成员函数也是常量,而 constexpr 不会对其所有用途强制执行编译时常量结果。这种灵活性允许混合函数在可能的情况下返回编译时结果,但在非 constexpr 上下文下恢复到运行时计算。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3