1. constexpr简介
constexpr 是 C++11 中引入的一个关键字,它主要用于在编译时确定表达式的值。具体来说,constexpr 可以用于以下场景:
- 变量声明:使用
constexpr声明的变量必须在声明时就赋值,而且其值在编译时必须可以确定。这样的变量通常用于存储编译时常量。
constexpr int pi = 3; // 正确
constexpr int a = getNumber(); // 错误:getNumber() 是一个运行时函数
- 函数声明:使用
constexpr声明的函数要求其参数和返回值类型都支持 constexpr 操作,也就是说,这些类型应该是编译时常量。函数体中的所有变量也必须是编译时常量。这种函数通常用于在编译时进行计算。
constexpr int add(const int a, const int b) {
return a + b;
}
- 类成员函数:如果一个类的成员函数被声明为
constexpr,那么该函数可以在 const 对象上被调用,并且它只能在类定义中包含一些编译时的计算。如果一个类的成员函数是constexpr,那么该类的所有成员变量也必须是constexpr。
constexpr 可以帮助我们进行编译时计算,从而优化程序的性能,并提高程序的安全性。
2. constexpr和const的区别
constexpr 和 const 都用于声明常量,它们的区别如下:
- 定义方式:
const是在程序运行时期定义的,而constexpr是在编译时期定义的。 - 作用域:
const的作用域仅限于声明它的函数或代码块,而constexpr的作用域是全局的。 - 优化:
const仅在运行时优化,而constexpr可以在编译时进行优化。 - 初始化和赋值:
const可以进行初始化或赋值,而constexpr必须在声明时就赋值。 - 访问修饰符:
const可以使用const或非const修饰符进行访问,而constexpr只能使用const修饰符进行访问。 - 存储类型:
const可以是任何类型,而constexpr必须是编译时常量类型。
constexpr 比 const 更加强大和灵活,它可以在编译时进行计算和优化,提高程序的性能和安全性。