constexpr

(常量表达式: 值不会改变并且在编译期间就能得到表达式的结果。)

<span style="font-size:14px;"> const int a (20);//a是常量表达式

const int limit  (a + 1);//limit是常量表达式

const int sz  (get());//sz不是常量表达式,get()函数需要运行时才能确定返回值。

int staft  (27);//staft不是常量表达式</span>

所以,一个对象为常量表达式由他的数据类型和初始值决定。那么为了更方便的判断某个对象的值是否为常量表达式,引入了constexpr关键字,这使得可以通过在对象前写上constexpr关键字,让编译器替我们判断这个对象的值是否为常量表达式。所以声明为constexpr的对象一定是常量,并且其初始值必须为常量表达式。由此可以看出,constexpr只不过是让编译器替我们判断对象是否是一个常量表达式,换句话说,声明constexpr后的对象和声明为const并且初始化为常量表达式是一样的。所以我认为,编译器对待constexpr对象的作为是编译器对待const对象所有作为中的一种特殊情况。

 

对象声明为什么类型可能是常量表达式呢?

(字面值类型: 这些类型一般比较简单,并且值也显然意见,容易得到)

算术类型,引用指针 都属于字面值类型,但是对于类类型 , IO库不是字面值类型。

对于算术类型:如果想使得被声明的对象为常量表达式,那么初始化为返回类型为常量的常量表达式。

对于引用和指针:如果想使得被声明的对象为常量表达式,那么其初始值为nullptr0或者指向一个固定地址的对象(全局变量等),同时 定义一个constexpr指针,constexpr仅仅对指针有效,对指针指向的对象无影响(但是,const则相反)

(对于函数和枚举类型后谈。)

 

 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值