关键字 constexpr 是在 C++11 中引入的,并在 C++14 中进行了改进。
作用
它是用于表示 constant(常量)表达式的。
常量表达式是指值不会改变并且在编译过程就能得到计算结果的表达式。
使用常量表达式可以提高程序的执行效率,因为表达式只需要在编译阶段计算一次,节省了每次程序运行时都需要计算一次的时间。
声明为constexpr的变量一定是一个const变量,而且必须用常量表达式初始化:
const和constexpr的区别:
const 变量的初始化可以推迟到运行时进行。 constexpr 变量必须在编译时进行初始化。
constexpr修饰普通变量
修饰变量时,constexpr和const效果相同
使用 constexpr 修改普通变量时,变量必须经过初始化且初始值必须是一个常量表达式。
constexpr修饰函数的返回值
被修饰的函数又称为“常量表达式函数”
注意:一个函数要想成为常量表达式函数,必须满足如下 4 个条件。
1.整个函数的函数体中,除了可以包含 using 指令、typedef 语句以及 static_assert 断言外,只能包含一条 return 返回语句。且return返回的表达式必须是常量表达式
错误用法:
2.函数必须有返回值,即不能出现constexpr void,可以出现constexpr int、constexpr float…
3.常量表达式函数在使用前,必须要有该函数的定义
constexpr修饰类的构造函数
对于 C++ 内置类型的数据,可以直接用 constexpr 修饰,但如果是自定义的数据类型(用 struct 或者 class 实现),直接用 constexpr 修饰是不行的。
若要使用,正确的做法是在该类的内部添加一个常量构造函数。
要求:该构造函数的函数体必须为空,且采用初始化列表的方式为各个成员赋值时,必须使用常量表达式。
用constexpr修饰成员函数、成员变量的方法和修饰普通函数、普通变量的方法相同
注意:C++11 标准中,不支持用 constexpr 修饰带有 virtual 的成员方法。
constexpr修饰模板函数
注意:C++11 标准规定,如果 constexpr 修饰的模板函数实例化结果不满足常量表达式函数的要求,则 constexpr 会被自动忽略,即该函数就等同于一个普通函数。
解析:
第21行,当模板函数中以自定义结构体 myType 类型进行实例化时,由于该结构体中没有定义常量表达式构造函数,所以实例化后的函数不是常量表达式函数,此时 constexpr 是无效的;
第24行,模板函数的类型 T 为 int 类型,实例化后的函数符合常量表达式函数的要求,所以该函数的返回值就是一个常量表达式。