目的:常量表达式中可以被调用的足够简单的函数,和用户自定义的类型常量对象可以使用足够简单的构造函数创建。
常量表达式
首先明确一个概念, const expression
(常量表达式),指的是在编译器可以被求值的表达式。可以在如下的场合使用:
- 数组大小,switch case的值,枚举值的定义
- 模板参数的非类型的特化的值
- 静态存储对象的静态初始化
常量表达式函数
一个函数如果是常量表达式函数,它需要满足
- 有返回值,级不能
return void
- 它的函数体仅为
return expr;
形式,即仅可有一条简单的return
语句 。expr
是一个常量表达式。 - 使用
constexpr
修饰
一个常量表达式函数可以被一个非常量表达式调用,此时,常量表达式函数并不需要保证能够在编译器求值。
常量表达式函数不支持递归。
常量表达式数据
常量表达式数据指的是使用constexpr
声明的变量或者数据成员。其必须被常量表达式初始化,或者是被常量表达式构造函数(其参数也应为常量表达式)创建的右值。
使用constexpr
的声明的变量和数据成员行为上类似使用const
声明的变量和数据成员,除了前者在使用之前需要初始化和它必须使用常量表达式来初始化。
常量表达式构造函数
常量表达式构造函数需要满足以下几点:
- 被
constexpr
指示符修饰的构造函数 - 使用初始化列表时,初始化列表的值都应为常量表达式。
- 函数体为空
使用常量表达式构造函数(参数也为常量表达式)构造的用户自定义类型的对象,称为用户自定义常量。