const的功能
- 修饰变量。修饰变量为常量 const int a= 4。
- 修饰普通函数。修饰函数的入参和返回参数为只读。
- 修饰类成员函数。表面类的成员函数隐含const this指针,不会修改类的数据成员。
constexpr出现的意义
在c++11出现以前,const关键字承载了太多的含义,最主要的两个作用是修饰变量只读和修饰变量是常量。从c++11开始,引入了constexpr关键字用来专属修饰表达式是编译期常量表达式,用于和const的运行时常量做区分。
constexpr的功能
修饰变量
定义常量,且仅修饰顶层const语义
1)constexpr int b = 1;//使用字面值初始化常量b
2)constexpr char* p ="hello";
p="world";//error 不可更改p的指向,等价char * const p="hello"
3)constexpr char const *p ="hello";//使用const显示修饰底层const
修饰类的static成员变量,包含inline语义
class A
{
public:
static constexpr int num_ ;
static const int num1_;
};
使用const修饰的static变量,默认没有inline属性,需要在类外进行定义。
使用constexpr修饰的static变量则不需要类外定义。
修饰函数
被constexpr修饰的函数表明向编译器告知,此函数在某些入参时可在编译期间得到结果,请按照那样来优化我。
注意,只是可能,编译器无法通用的检查是否满足要求,不满足时退化成普通函数使用。
constexpr int test(int test)
{
return test+5;
}
constexpr int ret = test(1);//此处必须使用字面值入参,否则会退化成普通函数,导致ret处因返回非常量而编译失败
constexpr限定规则
- constexpr变量必须定义时就用常量表达式/字面量初始化
- constexpr函数内部不许调用任何非constexpr函数
- 其他复杂规则详见扩展资料
扩展资料
const
https://blog.csdn.net/Eric_Jo/article/details/4138548
constexpr