新年伊始,要说什么选题最合适,那无疑是 C++23 了。 去年只写过 Ranges 和几个小特性的提案,对于其他特性,就全放在此篇一览究竟。 23 是个小版本,主要在于「完善」二字,而非「新增」。因此,值得单独拿出来写篇文章的特性其实并不多,大多特性都是些琐碎小点,三言两语便可讲清。 本篇包含绝大多数 C++23 特性,难度三星就表示只会介绍基本用法,但有些特性的原理也会深入讲讲。 Deducing this(P0847) Deducing this 是 C++23 中最主要的特性之一。msvc 在去年三月份就已支持该特性,可以在 v19.32 之后的版本使用。 为什么我们需要这个特性? 大家知道,成员函数都有一个隐式对象参数,对于非静态成员函数,这个隐式对象参数就是 this 指针;而对于静态成员函数,这个隐式对象参数被定义为可以匹配任何参数,这仅仅是为了保证重载决议可以正常运行。 Deducing this 所做的事就是提供一种将非静态成员函数的「隐式对象参数」变为「显式对象参数」的方式。为何只针对非静态成员函数呢?因为静态成员函数并没有 this 指针,隐式对象参数并不能和 this 指针划等号,静态函数拥有隐式对象参数只是保证重载决议能够正常运行而已,这个参数没有其他用处。 于是,现在便有两种写法编写非静态成员函数。 struct S_implicit { void foo() {} }; struct S_explicit { void foo(this S_explicit&) {} }; 通过 Deducing… Continue Reading Overview of C++23 Features

import std; auto main() -> int { std::println("Hello world!"); } 随着 Modules 和 Formatting Library 顺利进入 C++20,标准库 Modules 和 Formatted output 进入 C++23 不过是水到渠成。这种先引入再扩展的标准发展方式在 C++ 中已不稀奇,这两个新特性自然也就成为 C++23 中主要的特性之二。 C++2a 之后,Ranges, Modules, Concepts, Coroutines, 以及将要引入的新特性,都将会在一定程度上改变我们以往的编译方式。而这一切的基础,都在于新特性是否足够完善。三年一小步,六年一大步,此之谓也。 由经典的入门代码,可以看到,C++俨然成为了一门新语言。越现代,越强大,这种使用方式以后可能会越发流行。因为不论是性能还是可用性,新特性都更具有优势。 首先是标准库 Modules。 Modules 具有缩短编译时间、解决重复替换、导入顺序无关,以及无需分离接口与实现等等优势,若标准库迟迟不提供 Modules 版本,反而会阻碍 Modules 的发展。因此,标准库Modules的优先级并不低,进标准也是顺理成章。 其次是Formatted output。 用过 fmt 库的都清楚,这可是个好东西,或者可以说是 cout 终结者。… Continue Reading “Hello World” in C++23