![](https://img-blog.csdnimg.cn/20210605100329605.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++11~C++20
文章平均质量分 89
C++11,C++14,C++17和C++20的新特性
@一鸣惊人
这个作者很懒,什么都没留下…
展开
-
C++17:decltype类型推导
在编程过程中,有时我们需要根据表达式的类型来声明变量,尤其是在涉及模板编程,本文从泛型编程中经常会遇到2个常见问题入手,循序渐进的分析了从C++11开始引入的关键字decltype,除此之外还介绍了decltype(auto)推导过程。原创 2023-06-17 23:03:45 · 613 阅读 · 0 评论 -
C++20:换了“心“的auto关键字
C++98中auto无任何实质功能,但是从C++11开始auto变成具备实质功能的关键字, 这就是所谓的auto换“心”, C++11标准委员会赋予了auto两个能力:第一,变量定义可根据初始化表达式自动类型推导;第二,声明函数返回值的占位符,允许函数后置返回类型。C++14对auto函数占位符进行了简化,允许lambda形参声明使用auto;C++17将auto引入到非类型模板的声明和结构化绑定; C++20允许函数形参声明使用auto。本博客为大家详细介绍auto的演进过程以及auto的类型推导规则。原创 2022-12-06 23:06:41 · 1618 阅读 · 2 评论 -
C++11:右值引用与万能引用
引用由C++98标准引入,由于引用只能绑定左值;所以Morden C++(C++11及以后标准)引入右值引用解决绑定右值的问题,右值引用可以说是对传统引用的扩充。经Morden C++扩充后,传统C++的引用,在Morden C++中变成左值引用;Morden C++引入右值引用,从而引出移动语义;右值引用只能引用右值不能引用左值,左值引用只能绑定左值,const左值引用可以引用右值。万能引用时,引用折叠时只要有左值引用出现,折叠后的类型就是左值引用,否则为右值引用。原创 2023-03-15 07:33:53 · 556 阅读 · 0 评论 -
C++11:为何引入noexcept替代throw
做为C++11新引入的关键字,noexcept既是说明符,也是运算符。作为说明符,它的作用是指定函数是否抛出异常;作为运算符,它的作用是编译时检查,表达式不会抛出任何异常则返回 true,否则返回false。一般情况下函数不会抛出异常最好添加noexcept说明符,这样可以提升函数执行效率,而且优先使用noexcept替代throw。原创 2022-12-03 10:45:17 · 1085 阅读 · 0 评论 -
C++20:列表初始化,聚合初始化,强制省略拷贝优化,指定初始化......
变量的初始化是C++标准的一个重要组成部分,C++初始化按照是否存在拷贝,可将初始化划分为直接初始化和拷贝初始化;其他初始化均可以归类为此两大类。本文围绕此分类标准,分别介绍了:C++98标准的直接初始化,拷贝初始化,聚合初始化,圆括号初始化;C++11标准的列表初始化和initializer_list; C++17标准的强制省略拷贝优化,列表初始化类型推导,聚合初始化扩展(允许基类);C++20标准的聚合初始化的扩展,指定初始化器初始化。原创 2022-11-20 20:34:26 · 1119 阅读 · 0 评论 -
C++17:static_assert的原理
本文从static_assert和assert的定义切入,分别详细介绍static_assert引入的原因,如何使用static_assert,最后以static_assert实现作为本文的结束。希望本文的介绍可以加深你对静态断言static_assert的理解。原创 2022-11-15 22:08:30 · 5748 阅读 · 2 评论 -
C++20:constexpr、consteval和constinit
C++从C++11开始支持constexpr,直到C++20对constexpr的完整支持,constexpr标准化跨越了13年,由4个标准实现。C++20也是最接近最初语言设计模板的版本,但是constexpr的设计其实也不够严谨,所以 C++20 引入了 consteval;由于constexpr仅能实现编译时常量求值,为了解决编译时非常量求值问题,C++20又引入了constinit关键字。本文详细介绍constexpr/constinit/consteval支持历史和版本。原创 2022-11-12 13:36:07 · 2764 阅读 · 0 评论 -
C++11:为何引入final&override
final和override都是C++11新引入的关键字,由于两关键字都于继承控制相关,所以我们称final和override为继承控制关键字,需要说明的是final可作用于类,亦可作用于成员函数,override则只能作用于虚函数。本文从C++98&C++03标准中存在的问题入手,深入浅出的介绍了C++11引入final&override的原因及其所解决的问题。原创 2022-11-06 22:43:10 · 588 阅读 · 2 评论 -
C++11:nullptr_t与nullptr的原理
nullptr是一个有类型的右值常量,可很好的解决了整数0和空指针的问题。本文从C++11~C++20标准nullptr和nullptr_t规定和特性出发,介绍了一种可能的nullptr_t实现方式。同时建议大家在开发过程中优先使用nullptr替代NULL。原创 2022-09-26 22:00:34 · 2047 阅读 · 0 评论 -
C++11:函数对象、闭包和Lambda
本文从函数对象入手,循序渐进介绍了函数对象,闭包和Lambda函数等概念,并通过分析gcc产生的gimple代码,从两个角度介绍了Lambda函数的实现原理和mutable关键字的工作原理。希望对你有所帮助。原创 2022-09-19 21:49:01 · 1096 阅读 · 2 评论 -
C++11:可调用对象
可以调用对象是C++11引入的新概念,指代此对象可以像函数调用方式的触发调用的对象。在C++98标准中,可以被通过函数方式调用的对象有3个,他们分别是普通函数,函数指针,仿函数。C++11中增加了bind生成对象,lamdba表达式和function对象。所以C++11可调用对象总计6种:他们分别是普通函数,函数指针,(仿函数)函数对象,bind生成对象,lamdba表达式和function对象。原创 2022-05-04 10:39:20 · 2228 阅读 · 7 评论 -
C++11:论构对象的构建和释放
对象的构建和释放,在C++中占据着举足轻重地位,而构造函数和析构函数分别负责对象的构建和释放,因此详细分析阐述对象的构造函数和析构函数就显得尤为重要和必要了,本博客将从默认构造,拷贝构造,移动构造,委托构造等角度分析对象的构建;从析构的调用时机,功能以及成员变量释放顺序三个角度分析对象的释放。原创 2021-05-01 10:19:17 · 897 阅读 · 0 评论 -
C++11:深刻理解成员变量初始化顺序
类通常由类成员变量和类成员方法组成。类的成员变量又被称为类属性,类的成员方法描述当前类所支持的操作,而操作对象一般也是类的成员变量。由此可以看出类的成员变量,是类定义中最关键所在。本文将重点讨论类成员变量的初始化,包括初始化方法,初始化规则等。原创 2021-05-01 00:37:19 · 2843 阅读 · 5 评论 -
C++11:Default和Delete
目录引子默认构造函数析构函数默认拷贝构造函数默认拷贝赋值运算默认移动构造函数默认移动赋值函数defaultdeleteC++11之前C++11实现引子default和delete是C++11新添加的关键字,依靠这两个关键字C++编译器可以控制函数的默认生成和删除,这是对C++98标准的很大升级。这儿需要说明的是default仅仅可以控制类的...原创 2019-10-20 11:59:20 · 2142 阅读 · 2 评论