C++ 23版的最新特性

news/2024/12/25 13:53:43/

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 编码,就能够正确地显示这些文本信息。


http://www.ppmy.cn/news/1558008.html

相关文章

蓝桥杯刷题——day9

蓝桥杯刷题——day9 题目一题干解题思路一代码解题思路二代码 题目二题干解题思路代码 题目一 题干 小蓝最近在研究一种浮点数的表示方法&#xff1a;R格式。对于一个大于0的浮点数d&#xff0c;可以用R格式的整数来表示。给定一个转换参数n&#xff0c;将浮点数转换为R格式整…

【HTML】动态闪烁圣诞树+雪花+音效

效果展示 使用方法&#xff1a; 1、桌面新建文本文档.txt 2、下述代码复制至文本文档中 3、修改t后缀txt修改为html 4、双击点开 完整代码自取 <!DOCTYPE html> <html lang"en" ><head><meta charset"UTF-8"><title>M…

Flutter 基础知识总结

1、Flutter 介绍与环境安装 为什么选择 Dart&#xff1a; 基于 JIT 快速开发周期&#xff1a;Flutter 在开发阶段采用 JIT 模式&#xff0c;避免每次改动都进行编译&#xff0c;极大的节省了开发时间基于 AOT 发布包&#xff1a;Flutter 在发布时可以通过 AOT 生成高效的 ARM…

链路聚合与GVRP的混合构建(eNSP)

目录 拓扑图&#xff1a; 前置操作&#xff1a; GVRP全局开启&#xff1a; 查询&#xff1a; 实验背景&#xff1a;前面依次搭建了交换机的链路聚合实验手册以及动态vlan GVRP&#xff0c;为了模拟真实环境&#xff0c;本次实验将两者结合。 拓扑图&#xff1a; 前置操作&…

Springboot基于Web的辅助教学平台ln5i2(程序+源码+数据库+调试部署+开发环境)

本系统****&#xff08;程序源码数据库调试部署开发环境&#xff09;带论文文档1万字以上&#xff0c;文末可获取&#xff0c;系统界面在最后面。**** 系统程序文件列表 学生,教师,课程类型,课程信息,选课信息,作业信息,作业提交,作业批改,课程考勤,成绩信息 开题报告内容 …

《开启微服务之旅:Spring Boot 从入门到实践》(三)

自动配置原理 配置文件到底能写什么&#xff1f;怎么写&#xff1f;自动配置原理&#xff1b; https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/htmlsingle/#common-application-properties 自动配置原理 SpringBoot启动的时候加载主配置类&#xff0c;开启…

MFC/C++学习系列之简单记录10——定时器

MFC/C学习系列之简单记录10——定时器 前言Time定时器具体使用步骤.h文件.cpp文件错误和解决 总结 前言 今天学习一下MFC的定时器的使用&#xff01; Time定时器 定时器的作用是允许开发者在应用程序中创建定时器&#xff0c;以便在指定的时间间隔后执行特定的任务。 定时器…

“自动驾驶第一股” 图森未来退市转型:改名 CreateAI、发布图生视频大模型 “Ruyi”

12 月 19 日&#xff0c;自动驾驶公司图森未来&#xff08;TuSimple&#xff09;宣布启用全新品牌 CreateAI&#xff0c;并发布多项在生成式 AI 领域的进展。 CreateAI 宣布获著名武侠 IP《金庸群侠传》正版授权&#xff0c;将开发一款大型武侠开放世界 RPG 游戏。 新的 Creat…