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则相反)

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

 

 

 


你可能感兴趣的:(constexpr)