constexpr关键字

constexpr 是 C++11 引入的一个关键字,并在后续的 C++14、C++17 和 C++20 标准中不断得到增强。它的全称是 Constant Expression(常量表达式)

作用:constexpr 的主要作用是告诉编译器:**这个变量、函数或构造函数必须在编译期就能计算出结果,而不是等到运行时。**如果编译器无法在编译期计算出结果,代码将无法通过编译(报错)

主要应用场景:

1. 定义编译期常量

用于替代宏(#define)和 const,提供类型安全和作用域控制

cpp 复制代码
constexpr int max_size = 100; // 编译器直接将其替换为 100
int arr[max_size];            // 合法,因为 max_size 是编译期常量
2. 编译期函数计算

允许函数在编译期执行,只要传入的参数也是编译期常量。这可以用于元编程、数组大小计算、查找表生成等,极大地优化运行时性能

cpp 复制代码
constexpr int factorial(int n) {
    return (n <= 1) ? 1 : (n * factorial(n - 1));
}

// 在编译期计算 5! = 120
constexpr int val = factorial(5); 

int main() {
    int x = 5;
    // 错误:x 不是常量表达式,不能在编译期调用 constexpr 函数作为常量使用
    // constexpr int val2 = factorial(x); 
    
    // 合法:在运行时调用,constexpr 函数也可以像普通函数一样在运行时运行
    int val3 = factorial(x); 
}
3. 构造函数

标记构造函数为 constexpr,意味着如果用该构造函数创建对象时的参数都是常量表达式,那么该对象也可以在编译期创建

cpp 复制代码
struct Point {
    constexpr Point(double x, double y) : x_(x), y_(y) {}
    double x_, y_;
};

constexpr Point p(1.0, 2.0); // p 是一个编译期常量对象
4. C++14 及以后的增强

C++14 :放宽了限制,允许 constexpr 函数内部包含局部变量、循环(for, while)和分支语句,使得编写复杂的编译期逻辑成为可能。

C++17 :引入了 if constexpr,允许在编译期根据条件剔除代码分支,常用于模板元编程。

C++20 :进一步扩展,允许在 constexpr 中使用动态内存分配(但在编译期求值时有限制)、尝试捕获异常等,甚至支持大部分标准库算法在编译期运行

constexpr与const

const :表示"只读"。变量一旦初始化就不能修改,但初始化可以发生在运行时

cpp 复制代码
int get_val(); 
const int a = get_val(); // 合法,a 是运行时常量

constexpr :隐含了 const(即不可修改),但强制要求初始化必须发生在编译期

cpp 复制代码
int get_val();
constexpr int b = get_val(); // 错误!get_val() 不是 constexpr 函数,无法在编译期求值
相关推荐
沫璃染墨1 分钟前
《Qt从零入门系列(十三):QSS样式表详解——从选择器与层叠规则到控件美化实战》
开发语言·css·c++·qt·ui·qt6.3·qss
达子66642 分钟前
RUST 图解 第 3 章:通用编程概念(Common Programming Concepts)
开发语言·算法·rust
道尔柯南1 小时前
C++ 面向对象编程入门:类和对象(上)
开发语言·c++·算法
楠楠子呀1 小时前
英语、西语、阿语客户各开一个口:多语言获客的分流方案
开发语言·javascript·ecmascript·跨境电商·whatsapp·营销工具
tachibana21 小时前
使用for range 的时候,它的地址会发生变化吗?
开发语言·后端·golang·go·语法
临床数据科学和人工智能兴趣组2 小时前
正则表达式的基础语法的基本符号
开发语言·人工智能·python·正则表达式·r语言·r语言-4.2.1·workbudyy
王中阳Go2 小时前
Go 后端转 AI:非科班怎么补?一张 3 列路线表(可保存)
开发语言·人工智能·后端·python·golang·大语言模型
geats人山人海2 小时前
java 4继承
java·开发语言
aqiu1111113 小时前
【C++算法打怪专栏】C++ `unordered_set` 常用初始化与插入方法总结
开发语言·c++·算法
众链网络3 小时前
Agent 的成本大头不在“写“,在“判断“:拆解专用决策模型的三层架构
java·开发语言·人工智能·微服务