-
constexpr关键字的概念丰富,作用于对象和函数时意义不同。 -
作用于对象,
constexpr描述的对象是常量,且值在编译期已知。
int sz; // 未初始化的int
constexpr auto arraySize1 = sz; // error! sz的值在编译期未知
const auto arraySize2 = sz; // ok. arraySize2是sz的const copy。MSVS过编译但链接报错,GCC可以运行且输出为0。
std::array<int, sz> data1; // error, std::array的size必须在编译期已知
std::array<int, arraySize2> data2; // error, 同上
constexpr auto arraySize3 = 10; // ok
std::array<int, arraySize3> data3; // ok
-
总结:所有
constexpr对象都是const,但不是所有const对象都是constexpr。当你需要保证一个变量是编译期已知(已初始化)的常量时,使用constexpr而不是const。 -
作用于函数,
constexpr描述的函数被调用时如果参数是编译期常量,则其值也在编译期被计算;如果有一个或更多参数在编译期未知,则表现与普通函数一样。相当于是一个纯编译期的常量函数与一个普通函数的二合一。 -
接下来通过一个情景展示
constexpr的使用如何扩展到超出你想象的范围。假设我们要在一个std::array中存储某个系统的状态,状态的数量(数组空间)大小是 3n3^n3

本文详细解析了C++中的constexpr关键字,介绍了其在对象与函数上的不同应用。对于对象,constexpr确保其为编译期已知的常量;对于函数,当参数为编译期已知时,函数结果也可在编译期计算。此外,还展示了constexpr在复杂场景中的运用,如自定义pow函数及用户定义类型的constexpr成员函数。
最低0.47元/天 解锁文章
529

被折叠的 条评论
为什么被折叠?



