C++11/17/20新特性
文章平均质量分 93
本专栏原本只记录了C++11新特性,奈何c++发展迅速,一些新版本特性极大的提高了开发效率,故将新版本特性都收录在此专栏中
AlbertS
一个手残党怀着对游戏的好奇心踏上了开发之路,旅途中磕磕绊绊踩了不少坑,触了不少雷,深知好记性不如烂笔头的道理,于是记录下学习路上的点点滴滴,努力在这个浮躁的年代做一个专注的人,携码起舞,与君共勉。
Coding是件有趣的事情,快乐的看待每一天,我真的非常幸福~
展开
-
C++20中的关键字
源于上一篇中提到了decltype是一个关键字,所以去查了现有的关键字列表,其实我对C/C++的关键字还停留在上世纪大概30多个的时代,虽然知道C++加了autoconstexpr等关键字,但查询过后才发现原来他扩充到了将近100个,而C语言的关键字也扩到了六七十个,有点震惊了...原创 2023-10-07 23:36:39 · 766 阅读 · 0 评论 -
C++中的decltype、std::declval 和 std::decay_t傻傻分不清楚
在C++中提到推导第一个映入脑海的可能是“模板”,当然有人也可能想到auto,这些都是和推导相关的语言语法,再比如“完美转发”等等,总是就是他们的类型不用明明白白的写出来,可以利用一种简单的方式来定义,比如candidates是一个字符串数组, 如果遍历它我们可以写成,而不用将skillId变量定义成,这在一定程度上带来了便利,今天的几个东东也是用于推导的,我们一起来看看...原创 2023-09-05 21:47:01 · 2022 阅读 · 0 评论 -
C++编程中的六种内存顺序模型
程序员真是一个活到老学到老的职业,一天不学习就会掉队,『内存顺序模型』对于我来说就是一个新的世界,虽然之前写过多线程的服务器,也处理过死锁和竞态条件等问题,但是从来没考虑过内存顺序问题,所以当我第一次看到这个概念时,整个人都是懵的,经过一段时间的学习和了解有了初步的认识,所以简单总结下来,以备后续查看,不多写,慢慢总结...原创 2023-08-24 23:01:59 · 1757 阅读 · 0 评论 -
C++中的 i++ 和 ++i 这两种自增运算不是原子操作
C++中的i++和++i这两种自增运算是不是原子操作,突然被这么一问竟有点不知所措,这么“简单”的操作应该是原子的吧,但是好像有读又有写应该不是原子操作,原子操作就是那种刷一下就能完成的操作,准确来描述就是一个操作不可再分,要完成都完成不能存在中间态,咦?怎么听起来和事务这么像?那么i++和++i是不是原子操作我们看它是否满足不可再分就行了...原创 2023-07-04 09:58:39 · 400 阅读 · 0 评论 -
C++访问std::variant类型数据的几种方式
`std::variant`(可变体) 是 `C++17` 中引入的一个新的类模板,提供了一种存储不同类型的值的方式,类似于之前版本中的 `union`(联合体),但可以存储非 `POD` 类型和类对象,能够在运行时进行类型检查和转换,但具有更多的功能和更高的类型安全性,今天来看一下存储在`std::variant`中的数据要怎么读取...原创 2023-06-23 21:24:41 · 4542 阅读 · 0 评论 -
参考开源项目实现一个简易的C++枚举转字符串的函数
前段时间接触了 magic_enum 这个开源库,代码量不算太多,是一个但头文件的枚举操作库,关于如何使用还写了一篇总结 《推荐一个C++枚举转字符串的开源项目magic_enum》,当时觉得这个库很棒,但是对于我当前枚举转化字符串的需求还说还是太臃肿了,所以决定改造一下,这不今天过来填坑了...............原创 2022-08-07 17:39:57 · 3796 阅读 · 6 评论 -
std::uniform_real_distribution的一个bug引发的服务器崩溃
近日发生一次线上游戏服务器宕机问题,通过日志和core文件信息定位到崩溃的函数,但是崩溃的位置却是一段很长时间都没有改动过的代码,起初怀疑是配置数据的问题,但仔细查看之后均正常,然后又怀疑是玩家旧数据异常导致,但是分析代码逻辑后也没发现问题,最后是一个同事发现生成随机数的代码有bug,导致数组越界了,真是一个意想不到的问题............原创 2022-08-07 01:47:11 · 2761 阅读 · 0 评论 -
推荐一个C++枚举转字符串的开源项目magic_enum
C++11引入了强类型的枚举类 `enum class` 用来代替旧风格枚举`enum`,新引入的 `enum class` 具有诸多优点:防止命名空间污染,不能隐式的转换为整型,防止不同类型的枚举相互赋值,支持前置声明。当然它也不是只有优点,因为类型不能隐式转换成int,所以在使用或者输出时需要使用 `static_cast` 进行转换,不过即便使用 `static_cast` 可以转换后输出,也不便于我们辨识枚举的值,如果想输出枚举定义时的名字就需要使用一些魔法了......原创 2022-07-24 02:42:09 · 3808 阅读 · 2 评论 -
C++17使用std::optional表示一个可能存在的值
平时写代码会遇到一种传递参数`特殊值`标记特殊流程,或者函数返回值存在魔法数的情况,很需要一种标记参数或返回值状态的结构,那么在 C++17 标准下提供了 `std::optional` 这个模板类,可以表示一个值不存在的状态,一起来看看用法吧.........原创 2022-07-17 23:35:10 · 1281 阅读 · 5 评论 -
C++11中的noexcept说明符和操作符
`noexcept` 这个说明符看起来很厉害的样子,给人一种函数加上它就可以不产生异常的感觉,但事实真的如此吗?它真的能消除一切异常吗?答案是不能!它只是函数的一种说明,作为开发者我们需要自己保证标记了 `noexcept` 的函数不产生异常。啥?这不是没事找事吗?.........原创 2022-06-26 17:31:53 · 1659 阅读 · 6 评论 -
C++17新语法之if和switch语句中可以初始化变量啦
今天在看一些c++代码时偶然间发现一些示例,在if语句的小括号内居然出现了分号,难道这一段是伪代码吗?之前从来没见过这种写法,然后用写了一个例子,用最新的编译器编译后发现真的是正常的代码,并且可以成功运行,然后脑袋有个声音一闪而过,是不是一直就支持这种写法,只是我不知道而已,后来几经周折,终于发现真相,原来这其实是C++17新的语法......原创 2022-06-19 01:54:32 · 1898 阅读 · 0 评论 -
C++11新式洗牌std::shuffle与老式洗牌函数std::random_shuffle的区别
洗牌算法是项目开发中常用的一种算法,它和随机数有着密不可分的关系,比如我们从报名参与活动的前10个用户中选取一个人发放幸运奖,这时可以从[1, 10] 范围内随机一个数来确定幸运儿;如果是抽取两个人呢?那就随机两次!是的,确实可以这样做,但是随着随机次数的增多,后面随机的数字很可能和前面一样,这时就要重复随机才能解决...原创 2022-05-03 21:52:07 · 7359 阅读 · 6 评论 -
恶搞一下std::forward函数
关于 `std::forward` 的用法在之前的文章 《C++11中std::move和std::forward到底干了啥》已经总结过了,它被称为完美转发函数,用于函数模板中完成参数转发任务,当形参为左值引用时把它转发成左值,而在形参成为右值引用时把它转发成右值,依靠了引用折叠规则和 `std::remove_reference` 模板...原创 2022-05-01 23:05:28 · 1127 阅读 · 0 评论 -
C++可变参数模板的展开方式
可变参数模板(variadic templates)是C++11新增的强大的特性之一,它对模板参数进行了高度泛化,能表示0到任意个数、任意类型的参数。相比C++98/03这些类模版和函数模版中只能含固定数量模版参数的“老古董”,可变模版参数无疑是一个巨大的进步...原创 2022-04-05 22:10:26 · 9216 阅读 · 7 评论 -
C++11中的std::atomic保证的原子性是什么
提到atomic这个词,你首先想到的是什么呢?作为一个长时间混迹于编程世界的菜鸟,我首先想到的一个词是“原子性”,接着飞入脑海的是 “ACID” 这个缩写词组,它是指事务管理的4个特性,常见于数据库操作管理中,它们分别是:原子性,一致性,隔离性和持久性...原子(atom)是在化学反应中不可分割基本微粒,而编程世界中的原子性也是取自这里的不可分割的含义,不可分割与事务管理中的原子性含义一致,指的是一个操作或者一系列操作只能全都执行或者都不执行...原创 2021-10-06 00:39:39 · 3140 阅读 · 0 评论 -
从一个小题中的应用来体会下std::tie的便利之处
今天主要学习一下 `std::tie` 函数的使用方法,之前看到 `tie` 函数是和 IO 绑定的,最近发现它是和 `std::tuple` 绑定的,查询资料后发现两个函数虽然名字相同,但是在不同的作用域下,今天学一下和 tuple 有关的这个 `tie` 函数,不过在学习之前先看一道小题...原创 2021-08-15 23:49:22 · 913 阅读 · 0 评论 -
C++11中std::move和std::forward到底干了啥
C++11中的右值引用的出现,在特定情况下减少了对象的拷贝,提升了C++程序的效率,伴随而来的 `std::move` 和 `std::forward` 也大量出现在程序代码中,但是这两个函数究竟干了啥呢?其实他们的本质都是转换函数,也就是完成左值和右值之间的转换,需要注意的是左值可以转换成右值,但是右值无法转换成左值...原创 2021-07-19 00:13:30 · 5299 阅读 · 27 评论 -
换个角度来看看C++中的左值、右值、左值引用、右值引用
对于左值和右值有一个不太严谨的定义——在赋值表达式 `=` 左侧是的左值,而在 `=` 右侧的是右值。通过不断学习和尝试,最近我发现一个新的说法更加贴切,那就是“左值是容器,右值是东西”。对于这个定义我们可以类比一下水杯和水,通过水杯可以操作水杯中的水,操作过程中的中间结果如果想要进一步操作,可以将其放入其他的水杯,如果没有水杯就无法找到曾经操作过的水了,也就无法继续操作了...原创 2021-07-05 00:41:04 · 827 阅读 · 14 评论 -
C++中一些方便的算法函数和吃不够的语法糖
C++由于其复杂性,学习成本很高。但是作为接近底层的语言,学会之后能做的事情相当多,C++给了开发者极大的自由,只要符合规范就可以尽情的折腾,不过对于日常使用来说确实不太“方便”,特别是相比于Python、JS这类脚本语言,处理一些小问题时前奏太长,很多常用操作都需要自己造轮子,这一点在刷题时感觉很明显,C++一碰到字符串分析就“头大”,Python用一行搞定,用C++则需要N行...原创 2021-02-01 00:03:30 · 2442 阅读 · 3 评论 -
C++11在左值引用的基础上增加右值引用
右值引用这个词是最开始是学习 `easylogging++` 这个日志开源项目的时候遇到的,当时遇到 `&&` 这样的写法先是一愣,还有这种写法?难道是引用的地址?结果查询资料才明白这叫做右值引用...原创 2020-05-05 23:21:48 · 1927 阅读 · 20 评论 -
C++11中的时间库std::chrono(引发关于时间的思考)
时间是宝贵的,我们无时无刻不在和时间打交道,这个任务明天下班前截止,你点的外卖还有5分钟才能送到,那个程序已经运行了整整48个小时,既然时间和我们联系这么紧密,我们总要定义一些术语来描述它,像前面说到的明天下班前、5分钟、48个小时都是对时间的描述,程序代码构建的程序世界也需要定义一些术语来描述时间...原创 2020-04-12 13:52:47 · 7385 阅读 · 36 评论 -
没想到C++中的std::remove_if()函数历史还挺悠久
为什么要查单词的 remove 的意思,当然是被它坑过了,本来想从 `std::vector<T>` 中删除指定的元素,考虑到迭代器失效的问题,放弃了循环遍历的复杂处理,选择直接使用算法函数 `std::remove_if()`来进行删除,之前对于 `std::remove()` 和 `std::remove_if()` 有过简单的了解,不过记忆还是出现了偏差...原创 2020-03-21 12:13:31 · 5132 阅读 · 18 评论 -
std::bind(二):包装成员函数
文章目录前言普通函数嵌套包装包装类成员成员函数的包装成员变量的包装总结完整代码前言关于std::bind()对普通函数的包装作用,在之前的总结文章《std::bind(一):包装普通函数》已经举例说明过了,后来发现丢下了普通函数嵌套包装的情况,所以在这篇文章中继续说明一下,然后重点总结std::bind()函数对成员函数的包装,在面向对象的大潮还未褪去的今天,还是成员函数见到的更多一些,所以讲...原创 2019-08-20 14:52:51 · 5774 阅读 · 2 评论 -
std::bind(一):包装普通函数
文章目录前言std::bind()的作用placeholders的作用std::bind()使用测试固定参数、调换顺序包装后函数的参数个数可增可减bind()绑定时参数个数固定,类型需匹配普通函数的参数中有引用类型总结完整代码前言不知道大家在做项目写程序的过程中有没有遇到这样的情况,别的模块类提供了一个拥有很多参数接口函数,但是我这个功能只用到其中几个,其他的参数都是固定的,可是为了调用这个接...原创 2019-08-01 16:49:26 · 2278 阅读 · 7 评论 -
智能指针(四):unique_ptr浅析
前言unique_ptr这个指针是C++11标准时被引入标准库的,有一种说法称它是boost::scoped_ptr的一个分身,并且它在C++11的时候“转正”了,但是scoped_ptr还被留在boost库中,看来没有转正的机会了,不过unique_ptr与scoped_ptr确实很像,unique_ptr只比scoped_ptr多了一个移动语义,可以通过std::move()函数来转移内部...原创 2018-09-14 13:39:55 · 6580 阅读 · 6 评论 -
智能指针(三):weak_ptr浅析
weak_ptr这个指针天生一副“小弟”的模样,也是在C++11的时候引入的标准库,它的出现完全是为了弥补它老大shared_ptr天生有缺陷的问题,其实相比于上一代的智能指针auto_ptr来说,新进老大shared_ptr可以说近乎完美,但是通过引用计数实现的它,虽然解决了指针独占的问题,但也引来了引用成环的问题,这种问题靠它自己是没办法解决的,所以...原创 2018-09-01 14:36:26 · 53876 阅读 · 63 评论 -
智能指针(二):shared_ptr浅析
前言这个指针近乎完美,原来出现在boost库中,C++11时引入了标准库,解决了auto_ptr对内部对象独占的机制,转而采用引用计数的方式,每增加一次赋值,则引用计数加1,每析构一个智能指针对象,则引用计数减1,当引用计数为1时销毁智能指针对象的同时,也析构内部对象。这种采用引用计数方式避免了对象所有权转移,所以作为函数返回值,函数参数,容器的元素都不会有问题,但是因为引用计数的加入,相应的...原创 2018-08-18 13:17:17 · 2114 阅读 · 2 评论 -
C++11(二):lamda表达式
前言lamda表达式是c++11规范引入的新语法,我最早接触lamda表达式是在C#语言中,后来学习python的过程中渐渐发现这种语法的好处,实际上它就是一个匿名函数,如果你的代码里有一些只用了一次的小函数,不妨试试用lamda表达式来写一下。基本语法:[ capture-list ] ( params ) -> ret { body }原创 2017-02-28 17:52:31 · 2243 阅读 · 34 评论 -
C++11(一):在类的定义时初始化非静态变量
前言距离C++11标准发布时间大约有六年了,但是C++11的诸多特性并未在程序界达到普及的状态,甚至在一些“老程序员”看来,由于他们不了C++11标准新加入的内容,一些正常的程序常常被当做BUG处理,接下来我们就看看C++11加了那些特性,今天我们来测试一下:“在类的定义时初始化非静态变量”。不得不承认原创 2017-02-25 17:26:45 · 9076 阅读 · 11 评论