热门排行
简介
C++23标准2023版将是C++ 语言一次非常完善的更新,将为这门语言引入新特性。c++23标准文档是官方目前最新文件,更新2023年。C++23是 C++ 编程语言 ISO/IEC 14882标准继C++20 之后的下一个版本的非正式名称。需要的朋友可下载试试!
C++参考手册涵盖C++11,C++14,C++17,C++20,C++23,C++26,另外包含C++23版本的最终草案PDF文档。
C++23新特性
1、特性一、Deducing this
Deducing this是C++23中最重要的特性之一,它于去年3月份被msvc支持,并可在v19.32版本之后使用。
Deducing this所做的事情则是提供了一种将非静态成员函数的“隐式对象参数”变为“显式对象参数”的方法。为什么只针对非静态成员函数呢?因为静态成员函数并没有this指针,隐式对象参数并不能和this指针划等号,静态函数拥有隐式对象参数只是保证重载决议能够正常运行而已,这个参数没有其他用处。
2、特性二:Monadic std::optional(P0798R8)
P0798提议为std::optional添加三个新的成员函数:map()、and_then()和or_else()。这些函数的功能分别为:
map():对optional中的值应用一个函数,并返回一个包含应用结果的optional。如果optional中没有值,则返回一个空的optional。
and_then():将返回optional的函数与当前optional组合使用。
or_else():如果optional中存在值,则直接返回该optional,否则调用传入的函数来处理错误。 在R2中,map()被重命名为transform(),因此实际新增的三个函数为transform()、and_then()和or_else()。这些函数的主要作用是避免手动检查optional值是否有效。
3、特性三:std::expected(P0323)
该特性旨在解决错误处理问题,并引入了一个新的头文件<expected>。
错误处理的逻辑关系是一个条件关系,即如果条件成立,则执行逻辑A;否则,执行逻辑B,并需要准确的错误信息来采取相应的措施。目前常用的方式是使用错误码或异常,但这些方式使用起来仍然有许多不便之处。
std::expected<T, E>表示期望,相当于std::variant和std::optional的结合体,它可以保留T(期望的类型)或E(错误的类型),其接口与std::optional相似。
4、特性四:Multidimensional Arrays(P2128)
这个特性用于访问多维数组。以前,C++的operator[]只支持访问单个下标,无法访问多维数组。
因此,为了访问多维数组,以前的方法是:
重载operator(),然后就可以使用m(1,2)来访问第1行第2列的元素。但是,这种方法容易与函数调用产生混淆;
重载operator[]并使用std::initializer_list作为参数,然后就可以使用m[{1,2}]来访问元素。但是,这种方法看起来很奇怪;
链式链接operator[],然后就可以使用m[1][2]来访问元素。同样,这种方式也很奇怪。定义一个at()成员函数,然后使用at(1,2)来访问元素也不太方便。
5、特性五:if consteval(P1938)
该特性涉及到立即函数(immediate function),即consteval function。
它的目的是解决一个很简单的问题,即在C++20中,consteval function可以调用constexpr function,但反过来不行。
6、特性六:out_ptr(P1132r8)
C++23引入了两个新的抽象类型,即std::out_ptr_t和std::inout_ptr_t,以及对应的函数std::out_ptr()和std::inout_ptr(),用于方便地处理指针参数。
......