关键字constexpr
用于修饰常量表达式(const express),具体说明如下
字面值常量(literal)
- 由形式和值来决定数据类型
- 可手动指定类型
如:- 常规
20 —— 十进制数
0x8 —— 十六进制数
“hello” —— char[6] - 指定类型
3F —— float
L’a’ —— whar_t
u8”hi!” —— utf-8
3.14159 —— long double
- 常规
常量表达式(const express)
The constexpr specifier declares that it is possible to evaluate the value of the function or variable at compile time. Such variables and functions can then be used where only compile time constant expressions are allowed (provided that appropriate function arguments are given). A
constexpr
specifier used in anobject
declaration impliesconst
. Aconstexpr
specifier used in afunction
or static member variable (since C++17) declaration impliesinline
.
其中literal
就是const express
的一种。从文档可知,const express
主要性质是可以在编译期间得到值。同时,constexpr
修饰的对象自动获得常量属性,constexpr
修饰的函数自动获得内联属性。
constexpr变量
满足以下条件:
- 其值必须为
literal
类型。 - 必须能立即初始化,意味着所有的初始化方法,包括所有隐式转换、调用构造函数等,都必须为
const express
。
特别需要说明的是指针变量,constexpr
类型的指针变量有以下的几种存在方式:
指向nullptr
1constexpr int *p = nullptr;指向全局变量、static变量,因其地址不会改变
12int i = 0; // i 定义在函数外部,是一个全局变量constexpr int *p = &i; // 正确另外:
虽然constexpr
和const
在某些方面有点相似,但constexpr int *q = nullptr;
的含义却与const int *q = nullptr;
的有些出入,前者q
不能修改,后者*q
不能修改。若需要指向常量的常量指针,可以这样定义:constexpr const int *q = nullptr;
,这样q
和*q
就都是不可修改的常量了。
constexpr函数
constexpr
函数会被隐式地inline
。
满足以下条件:
- 形参和返回值都得为
literal
类型 - 只能有一条
return
语句
例:
constexpr类
满足以下条件:
- 该类是聚合类,所谓聚合类:
- 所有成员都是public
- 无显式定义的构造函数
- 成员无初始值
- 无基类,无virtual函数
- 若不是聚合类,需要满足
- 数据成员必须都为
literal
类型(函数成员无须是) - 至少含有一个
constexpr
构造函数 - 只能使用默认的析构函数
- 数据成员必须都为
例: