c++11特性之constexpr

本文介绍了C++11的constexpr特性,通过它可以让编译器验证变量是否为常量表达式。constexpr变量必须用常量表达式初始化,并受限于特定的类型如算术类型、引用和指针。函数若声明为constexpr,则其返回类型和参数类型必须为字面值类型,且函数体仅允许一条return语句。constexpr提供了编译期优化和安全性保障,是比宏更优的选择。
摘要由CSDN通过智能技术生成

更多c++后台开发知识点,请参考我的博客:https://blog.csdn.net/ypshowm

常量表达式是指值不会改变且在编译过程就能得到计算结果的表达式。显然,字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式。

在一个复杂的系统中,很难分辨一个初始值到底是不是常量表达式,因此

c++11规定:允许将变量声明为constexpr类型,以由编译器来验证变量的值是否是一个常量表达式,声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化:

constexpr int mf = 20;    //20是常量表达式
constexpr int limit = mf + 1;    //mf+1是常量表达式
cosntexpr int sz = size();    //只有当size是一个constexpr函数时,这条语句才正确

由于常量表达式的值需要在编译时就得到计算,因此声明constexpr时用到的类型必须有所限制。

算术类型,引用和指针属于字面值类型,自定义的类如IO库,string类型等不属于字面值类型,不能被定义成constexpr;

对引用和指针的限制:一个constexpr指针的初始值必须是nullptr或者0,或者是存储于某个固定地址中的对象

函数体内定义的变量一般来说是并非存放在固定地址中,因此constexpr指针不能指向这样的变量。相反,所有函数体之外的对象其地址固定不变,能用来初始化constexpr指针

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值