C++20中`constexpr`的显著增强

文章目录

    • 1. **更多标准库函数支持`constexpr`**
    • 2. **支持动态内存分配**
    • 3. **支持虚函数和多态**
    • 4. **支持`try-catch`异常处理**
    • 5. **更灵活的控制流**
    • 6. **支持`std::initializer_list`**
    • 7. **支持修改`union`活跃成员**
    • 8. **允许更多类型的非类型模板参数**
    • 总结

C++20对 constexpr进行了显著增强,进一步放宽了其使用限制,使其能够支持更复杂的编译时计算和逻辑。以下是C++20中 constexpr的主要变化和增强:

1. 更多标准库函数支持constexpr

C++20将许多标准库函数标记为constexpr,允许它们在编译时计算。这包括:

  • 容器操作,如std::vector::operator[]std::string::operator[]std::array::operator[]
  • 算法,如std::sortstd::find_ifstd::accumulate

2. 支持动态内存分配

C++20允许在constexpr函数中使用newdelete,从而支持更复杂的数据结构(如动态数组和链表)在编译时构建。例如:

constexpr int* createArray(int size) {int* arr = new int[size];for (int i = 0; i < size; ++i) {arr[i] = i * i;}return arr;
}

3. 支持虚函数和多态

C++20允许虚函数被声明为constexpr,从而支持在编译时对多态对象进行操作。例如:

struct Base {constexpr virtual int value() const { return 0; }
};
struct Derived : Base {constexpr int value() const override { return 1; }
};

4. 支持try-catch异常处理

C++20允许在constexpr函数中使用try-catch块,但异常必须在编译时处理。例如:

constexpr int SafeDivide(int a, int b) {if (b == 0) {throw std::runtime_error("Division by zero!");}return a / b;
}constexpr int ComputeQuotient(int x) {try {return SafeDivide(100, x);} catch (const std::runtime_error&) {return -1;}
}

5. 更灵活的控制流

C++20扩展了constexpr函数中允许的控制流,包括更复杂的循环和条件语句。例如:

constexpr int factorial(int n) {int result = 1;for (int i = 1; i <= n; ++i) {result *= i;}return result;
}

6. 支持std::initializer_list

std::initializer_list现在可以在constexpr上下文中使用。例如:

constexpr std::initializer_list<int> initList = {1, 2, 3, 4};

7. 支持修改union活跃成员

C++20允许在constexpr函数中修改union的活跃成员。例如:

union Foo {int i;float f;
};
constexpr int use() {Foo foo{};foo.i = 3;foo.f = 1.2f; // C++20支持return 1;
}

8. 允许更多类型的非类型模板参数

C++20进一步放宽了非类型模板参数的限制,支持浮点数、用户定义的字面类型等。例如:

template<auto ...> struct ValueList {};
ValueList<'C', 0, 2L, nullptr, Foo{}> x;

总结

C++20对constexpr的增强使其在编译时计算能力上更加强大和灵活。这些改进不仅简化了代码,还减少了运行时开销,提升了程序的性能和安全性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/896748.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tomcat 乱码问题彻底解决

1. 终端乱码问题 找到 tomcat 安装目录下的 conf —> logging.properties .修改ConsoleHandler.endcoding GBK &#xff08;如果在idea中设置了UTF-8字符集&#xff0c;这里就不需要修改&#xff09; 2. CMD命令窗口设置编码 参考&#xff1a;WIN10的cmd查看编码方式&…

以太坊测试网

文章目录 什么是测试网如何使用测试网获取测试以太币 什么是测试网 测试网&#xff08;Testnet&#xff09;是一个模拟以太坊主网&#xff08;Mainnet&#xff09;行为的区块链网络。它允许开发人员和用户在不使用真实资金的情况下测试智能合约和应用程序。虽然测试网上的代币…

算法随笔_62: 买卖股票的最佳时机

上一篇:算法随笔_61:二进制求和-CSDN博客 题目描述如下: 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获…

腾讯混元文生图大模型(Hunyuan-DiT)与Stable Diffusion(SD)对比分析

腾讯混元文生图大模型&#xff08;Hunyuan-DiT&#xff09;与Stable Diffusion&#xff08;SD&#xff09;对比分析 腾讯混元文生图大模型&#xff08;Hunyuan-DiT&#xff09;与Stable Diffusion&#xff08;SD&#xff09;作为当前文生图领域的两大代表模型&#xff0c;各自…

【HTML—前端快速入门】HTML 基础

准备工作 vscode下载 百度网盘 Subline Text 下载 Sublime Text下载 百度网盘 vscode 下载 Sublime Text 是一款轻量好用的文本编辑器&#xff0c;我们在写前端代码时&#xff0c;使用 Sublime Text 打开比使用记事本打开&#xff0c;得到的代码体验更好&#xff0c;比 vscode…

基于单片机的GPS定位系统设计

1 系统硬件 1.1单片机模块 单片机的种类和型号可以说是有成百上千种&#xff0c;很多大的公司和企业都生产开发自己的单片机芯片&#xff0c;并且广泛应用于各种产品。Intel、 philips、 摩托罗拉、凌阳、宏晶等等种类繁多。大体上可以分为51系列单片机和非51系列单片机。 其…

对大模型输出的 logits 进行处理,从而控制文本的生成

对大模型输出的 logits 进行处理&#xff0c;从而控制文本的生成 flyfish 在文本生成任务中&#xff0c;模型输出的 logits 代表了每个词被选为下一个生成词的未归一化概率得分。通过对 logits 进行处理&#xff0c;可以精确地控制文本的生成 基本原理 在每一步生成过程中&…

Reids缓存穿透、缓存雪崩和缓存击穿

Redis缓存中常见的三个问题&#xff1a;缓存穿透、缓存雪崩和缓存击穿。这些问题在使用Redis作为缓存时经常遇到&#xff0c;但通过合理的策略可以有效解决。我会用简单易懂的方式来讲解&#xff0c;帮助你理解这些问题的原理和解决方案。 1. 缓存穿透 1.1 什么是缓存穿透&…

附录-Python — 包下载缓慢,配置下载镜像

1️⃣命令行配置 pip config set global.index-url http://mirrors.aliyun.com/pypi/simple/ pip config set install.trusted-host mirrors.aliyun.com 2️⃣配置文件配置 1、打开文件夹&#xff0c;输入 %APPDATA% 回车 2、打开 %APPDATA% 路径&#xff0c;并在此路径下新建…

VS 2019 免费版 下载与安装 教程说明

推荐大家直接转到第13步&#xff0c;点击链接即可下载VS2019版本 1.VS官网 2.登录账号 3.在搜索栏输入“2019” 4.点击2019这个标题 5.点击“下载” 6.选择合适的版本下载 7.打开下载文件&#xff08;若下载过程总是转圈圈&#xff0c;则换个网络下载即可&#xff09; 8.安…

介绍 torch-mlir 从 pytorch 生态到 mlir 生态

一、引言 The Torch-MLIR project provides core infrastructure for bridging the PyTorch ecosystem and the MLIR ecosystem. For example, Torch-MLIR enables PyTorch models to be lowered to a few different MLIR dialects. Torch-MLIR does not attempt to provide a…

Java并发编程之ConcurrentHashMap的原理和使用

ConcurrentHashMap(CHM)是Java为解决高并发场景下哈希表性能瓶颈而设计的线程安全容器,其核心目标在于: 线程安全‌:避免多线程操作导致的数据不一致问题‌;高吞吐量‌:通过细粒度锁和无锁化设计降低线程竞争‌;动态扩展‌:支持自动扩容与数据结构优化(如链表转红黑树…

AbMole揭秘伤口愈合:IGF-1-SP1-CD248信号通路的新发现

科学家们揭示了一条新的信号通路——IGF-1-SP1-CD248&#xff0c;这一发现为理解伤口愈合障碍提供了新的视角&#xff0c;并为未来的研究开辟了新方向。 研究背景 糖尿病患者的伤口愈合是一个长期存在的挑战。据统计&#xff0c;约15%的糖尿病患者会遭受慢性伤口的困扰&#…

Go入门之文件

以只读方式打开文件 package mainimport ("fmt""io""os" )func main() {file, err : os.Open("./main.go")defer file.Close()if err ! nil {fmt.Println(err)return}fmt.Println(file)var tempSlice make([]byte, 128)var strSlice…

python量化交易——金融数据管理最佳实践——使用qteasy管理本地数据源

文章目录 统一定义的金融历史数据表最重要的数据表数据表的定义交易日历表的定义&#xff1a;交易日历表: trade_calendar qteasy是一个功能全面且易用的量化交易策略框架&#xff0c; Github地址在这里。使用它&#xff0c;能轻松地获取历史数据&#xff0c;创建交易策略并完…

通过 PromptTemplate 生成干净的 SQL 查询语句并执行SQL查询语句

问题描述 在使用 LangChain 和 Llama 模型生成 SQL 查询时&#xff0c;遇到了 sqlite3.OperationalError 错误。错误信息如下&#xff1a; OperationalError: (sqlite3.OperationalError) near "sql SELECT Name FROM MediaType LIMIT 5; ": syntax error [SQL: …

STaR(Self-Taught Reasoner)方法:让语言模型自学推理能力(代码实现)

STaR&#xff08;Self-Taught Reasoner&#xff09;方法&#xff1a;让语言模型自学推理能力 在大型语言模型&#xff08;LLM&#xff09;的推理能力优化中&#xff0c;STaR&#xff08;Self-Taught Reasoner&#xff09; 是一种引人注目的技术&#xff0c;属于“修改提议分布…

Asp.Net Web API| React.js| EF框架 | SQLite|

asp.net web api EF SQLiteReact前端框架 设计一个首页面&#xff0c;包含三个按钮分别对应三类用户&#xff08;数据查看&#xff0c;设计人员&#xff0c;管理员&#xff09;&#xff0c;当点击管理员的时候弹出一个前端页面可以输入信息&#xff08;以学生数据为例&#…

[SWPUCTF 2022 新生赛]1z_unserialize

题目描述&#xff1a;是很简单的反序列化噢 代码审计看注释 <?phpclass lyh{ //定义一个类为lyhpublic $url NSSCTF.com;//公共属性&#xff0c;初始值为NSSCTF.compublic $lt; //公共属性&#xff0c;没有初始值public $lly; //公共属性&…

【数据库】Update两阶段提交

为什么要两阶段提交 事务提交之后&#xff0c;redo log和bin log 都是需要1持久化到磁盘中&#xff0c;但是这两个是独立的逻辑&#xff0c;可能出现半成功的状态&#xff0c;这样就造成两份日志之间的逻辑不一致。如&#xff1a; 以id1&#xff0c;name ‘小明’执行 updat…