C++ 23版的最新特性
C++ 23 是 C++ 编程语言的最新标准版本,于 2023 年正式发布,带来了诸多新特性与改进,以下是一些主要内容:
1.语言特性
1.显式对象参数(Deducing this):显式对象参数(Deducing this)允许在非静态成员函数中显式指定对象参数。在以往的 C++ 版本中,this指针是隐式传递的,而 C++ 23 提供了一种更明确的方式来处理对象参数,这在一些复杂的编程场景和元编程场景下非常有用。
class MyClass {
public:void myFunction(MyClass* this, int arg) {// 函数实现}
};
在这个例子中,myFunction成员函数显式地指定了对象参数MyClass* this。这种写法使得函数调用的对象关系更加明确。
2.多维下标运算符重载:方便处理多维数组,让多维数组的访问和操作更加直观自然。比如
int arr[2][3][4];
arr[1][2][3] = 42; // 传统方式访问多维数组元素
// C++23 中可以这样重载下标运算符
class MyArray {
public:int& operator()(int i, int j, int k) {// 返回对应元素的引用return data[i][j][k];}
private:int data[2][3][4];
};
MyArray myArr;
myArr(1, 2, 3) = 42; // 通过重载的下标运算符访问和修改元素
3.静态运算符函数:引入静态operator(),使得静态成员函数可以像普通运算符一样被调用,增强了代码的灵活性和可读性。
class MathUtils {
public:static int operator()(int a, int b) {return a + b;}
};
int result = MathUtils()(5, 3); // 调用静态 operator() 实现加法运算
4. if consteval和if not consteval:用于在编译时进行条件判断并执行常量评估的语句,可用于优化代码和实现一些编译时的计算逻辑。
consteval int factorial(int n) {if (n == 0) return 1;else return n * factorial(n - 1);
}constexpr int result1 = factorial(5); // 编译时计算阶乘int runtime_value = 4;
int result2 = 0;
if not consteval {result2 = factorial(runtime_value); // 运行时计算阶乘
}
5.扩展的浮点类型:新增了std::float{16|32|64|128}_t和std::bfloat16_t等可选的扩展浮点类型,为数值计算提供了更多的精度选择。
std::float32_t myFloat32 = 3.14f;
std::float64_t myFloat64 = 3.14159265358979323846;
std::float128_t myFloat128 = 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679;
二、标准库特性
1.<expected>头文件与std::expected类型:用于处理函数可能返回的预期值和错误,将成功和失败的结果封装在单一的返回类型中,增强了错误处理的可读性和可维护性。例如,在文件读取操作中。
#include <expected>
#include <fstream>
#include <iostream>std::expected<std::string, std::string> readFile(const std::string& filename) {std::ifstream file(filename);if (file.is_open()) {std::string content((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());file.close();return content;} else {return std::unexpected("Error opening file: " + filename);}
}int main() {auto result = readFile("test.txt");if (result.has_value()) {std::cout << "File content: " << result.value() << std::endl;} else {std::cerr << "Error: " << result.error() << std::endl;}return 0;
}
2.<generator>头文件与std::generator:用于创建同步协程生成器,方便生成一系列的值,简化了异步编程中的数据生成逻辑。
#include <generator>
#include <iostream>std::generator<int> generateNumbers() {for (int i = 0; i < 5; ++i) {co_yield i;}
}int main() {auto gen = generateNumbers();for (auto num : gen) {std::cout << num << " ";}std::cout << std::endl;return 0;
}
3. 范围库的增强:新增了多个范围适配器和约束范围算法,如views::adjacent、views::adjacent_transform、ranges::starts_with、ranges::ends_with等,使对数据序列的操作更加丰富和灵活.
#include <iostream>
#include <string>int main() {std::string str = "Hello, World!";bool contains_world = str.contains("World");std::cout << "Contains 'World'? " << (contains_world? "Yes" : "No") << std::endl;std::string_view str_view = "This is a test";bool contains_test = str_view.contains("test");std::cout << "Contains 'test'? " << (contains_test? "Yes" : "No") << std::endl;return 0;
}
4.新的字符串处理方法:如std::basic_string::contains和std::basic_string_view::contains,方便判断字符串中是否包含特定的子串。
#include <iostream>
#include <string>int main() {std::string str = "Hello, World!";bool contains_world = str.contains("World");std::cout << "Contains 'World'? " << (contains_world? "Yes" : "No") << std::endl;std::string_view str_view = "This is a test";bool contains_test = str_view.contains("test");std::cout << "Contains 'test'? " << (contains_test? "Yes" : "No") << std::endl;return 0;
}
三、其他方面
1.模块系统的改进:进一步优化了模块的加载和编译性能,新的模块导入语法使模块间依赖关系更明确,降低了耦合度,有助于提高大型项目的开发效率和代码的可维护性,例如在游戏开发项目中可更好地划分和封装不同功能模块.
2.增强的概念(Concepts):对概念的语法进行了简化和改进,使概念定义更清晰易懂,能更精确地约束模板参数,避免类型不匹配错误,在模板元编程中的应用也得到增强,提高了代码的灵活性和可复用性.
3.预处理指令的扩展:新增了#elifdef、#elifndef、#warning等预处理指令,提高了条件编译的清晰度和灵活性.
#ifdef _WIN32
// 包含Windows平台相关的头文件
#include <windows.h>
#elifdef __APPLE__
// 包含苹果平台相关的头文件
#include <CoreFoundation/CoreFoundation.h>
#elifdef __linux__
// 包含Linux平台相关的头文件
#include <stdio.h>
#endif
4.UTF-8 源文件编码:规定 UTF-8 为可移植的源文件编码,确保不同平台上字符表示的一致性.
#include <iostream>
#include <string>
void setMenuItemTitle(std::string title) {std::cout << "设置菜单标题为: " << title << std::endl;
}
int main() {std::string frenchTitle = "Ouvrir";// 法语:打开std::string germanTitle = "Öffnen";// 德语:打开std::string chineseTitle = "打开";setMenuItemTitle(frenchTitle);setMenuItemTitle(germanTitle);setMenuItemTitle(chineseTitle);return 0;
}
在这个例子中,无论是法语、德语还是中文的字符串,都可以在 UTF - 8 编码的源文件中正确地表示和处理。这使得程序能够更好地适应全球化的需求,并且在不同的操作系统和终端设备上,只要它们正确地支持 UTF - 8 编码,就能够正确地显示这些文本信息。
相关文章:
C++ 23版的最新特性
C 23 是 C 编程语言的最新标准版本,于 2023 年正式发布,带来了诸多新特性与改进,以下是一些主要内容: 1.语言特性 1.显式对象参数(Deducing this):显式对象参数(Deducing this&…...
什么是 Memory-bound stalls,以及如何优化
Memory-bound stalls 是指在计算机系统中,程序的性能受到内存访问速度的限制,导致处理器无法高效执行指令。这种情况通常发生在 CPU 需要等待数据从内存中加载时,而不是在执行计算或处理指令时。 Memory-bound stalls 的成因 访问延迟&…...
机器学习 | 非线性回归拟合数据时的离群值检测
非线性回归是一种用于模拟变量之间复杂关系的强大工具。然而,离群值的存在可能会显着扭曲结果,导致参数估计不准确和预测不可靠。因此,检测离群值对于稳健的非线性回归分析至关重要。本文深入研究了在非线性回归中识别离群值的方法和技术&…...
使用elasticsearch-head插件修改elasticsearch数据
1、先使用elasticsearch-head插件基本查询功能找到要修改的数据 2、切换到复合查询界面 url: http://es的ip地址:端口号/索引名称/文档类型(没特殊设置过就是_doc)/文档id/ 例子:http://127.0.0.1:9200/tab_inout_record/_doc/84…...
202412月最新植物大战僵尸杂交版【V3.0.1】更新内容与下载
以下是对UI优化和新内容添加的摘要: UI优化摘要: 主界面重做:对游戏的主界面进行全面的设计更新,提升用户体验。商店重做:对游戏内的商店界面进行重新设计,以改善玩家的购物体验。选卡界面增加图鉴功能&a…...
游戏渠道假量解决方案
某推广公司在推广过程中被查出“短期内点击量激增”“存在同一地址多次访问”“已注册用户重复注册”等数据作弊行为,法院判罚退还服务费200余万元,并赔偿违约金约350万元。 某公司为提升其游戏在应用商店榜单排名,委托某网络公司进行下载、注…...
Java系统对接企业微信审批项目流程
若依做的一个系统需求需要对接企业微信的人员去审核订单 回款之类,以下是详细步骤. 1.首先登入企业微信管理后台: 企业微信 2.找到应用管理 3.自建一个应用 4.这些数据都可以拿到 5.配置可信Ip 6.进入有两种方法让你去配置 ,第一种用公司的…...
基于Springboot人口老龄化社区服务与管理平台【附源码】
基于Springboot人口老龄化社区服务与管理平台 效果如下: 系统登陆页面 系统主页面 社区信息页面 社区文件页面 活动报名页面 走访任务管理页面 社区资讯页面 老人信息管理页面 研究背景 随着社会老龄化的加剧,老年人口比例逐渐增加,对老年…...
Dot Foods EDI 需求分析及对接流程
Dot Foods 是一家美国领先的食品和非食品产品的中间批发分销商,主要为食品服务、零售和分销行业的客户提供服务,是北美大型食品中间分销商之一。Dot Foods (以下简称 Dot)的业务模式是通过整合多个供应商的产品,为客户…...
代码随想录day24 | leetcode 93.复原IP地址 90.子集 90.子集II
93.复原IP地址 Java class Solution {List<String> result new ArrayList<String>();StringBuilder stringBuilder new StringBuilder();public List<String> restoreIpAddresses(String s) {backtracking(s, 0, 0);return result;}// number表示stringb…...
探索国产数字隔离器——测试与应用
国产数字隔离器已成为现代电子产品中的关键部件,以增强的性能和可靠性取代了传统的光耦合器。这些隔离器广泛应用于医疗设备、汽车电子、工业自动化和其他需要强大信号隔离的领域。准确测试这些设备是确保其质量和性能的基本步骤。 如何测试数字隔离器 测试数字隔离…...
IDEA无法打开插件市场的解决
1.版本 我的IDEA版本号为2020.1.4 大家可以从IDEA的help->about进行版本号的查看 2.解决 我们直接到jetbrains官网搜索你想要下载的插件 直接下载即可自动导入...
以腾讯混元模型为例,在管理平台上集成一个智能助手
背景 前几天,公司的同事们一起吃了个饭,餐桌上大家聊到大模型的落地场景。我个人在去年已经利用百度千帆平台写过案例,并发过博客(传送门👉:利用文心千帆打造一个属于自己的小师爷),…...
15.初识接口1 C#
这是一个用于实验接口的代码 适合初认识接口的人 【CSDN开头介绍】(文心一言AI生成) 在C#编程世界中,接口(Interface)扮演着至关重要的角色,它定义了一组方法,但不提供这些方法的实现。它要求所…...
探索 Python编程 调试案例:计算小程序中修复偶数的bug
在 学习Python 编程的过程里,会遇到各种各样的bug。而修复bug调试代码就像是一场充满挑战的侦探游戏。每一个隐藏的 bug 都是谜题,等待开发者去揭开真相,让程序可以顺利运行。今天,让我们通过一个实际案例,深入探索 Py…...
【Unity/HFSM】使用UnityHFSM实现输入缓冲(预输入)和打断机制
文章目录 前言预输入Animancer的InputBuffer:在UnityHFSM中实现InputBuffer: 打断机制 前言 参考Animancer在状态机中的InputBuffer,在UnityHFSM中实现类似的InputBuffer机制,同时扩展一个状态打断机制 插件介绍: A…...
Unity 圆形循环复用滚动列表
一.在上一篇垂直循环复用滚动列表的基础上,扩展延申了圆形循环复用滚动列表。实现此效果需要导入垂直循环复用滚动列表里面的类。 1.基础类 using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; using …...
聚水潭数据无缝集成到金蝶云星空的实现方案
聚水潭数据集成到金蝶云星空:聚水潭调拨对接金蝶直接调拨ok 在企业信息化管理中,数据的高效流动和准确对接是实现业务流程顺畅运行的关键。本文将分享一个具体的系统对接集成案例——如何通过轻易云数据集成平台,将聚水潭的数据无缝集成到金…...
虚拟机断网没有网络,需清理内存,删除后再重启
进入NetworkManager可能没权限,设置权限777 to...
[c++11(二)]Lambda表达式和Function包装器及bind函数
1.前言 Lambda表达式着重解决的是在某种场景下使用仿函数困难的问题,而function着重解决的是函数指针的问题,它能够将其简单化。 本章重点: 本章将着重讲解lambda表达式的规则和使用场景,以及function的使用场景及bind函数的相关使…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...
在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...
CSS3相关知识点
CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...
