Modern Effective C++
文章平均质量分 62
Reading
暮雨林钟
人生何处不青山
展开
-
《Effective Modern C++》条款28:理解引用折叠
本章节主要说一下引用折叠的问题,解释一下型别推导形参的问题;Pre:先注意以下几点:右值的引用自己本身是左值;先进行型别推导,推导之后产生T,之后在引用冲突的地方进行引用折叠;引用折叠只出现在:型别推导,auto推导,dectype推导,typedef推导这四个地方,其他不会进行引用推导;基本概念:对于常规双引用,会直接报错,原因是:C++中不允许双引用,也就是说,不允许产生引用的引用,例如: int& &a这种情况但是引用折叠确实引用的引用;之前说过,例如:cla原创 2022-04-27 16:05:08 · 751 阅读 · 0 评论 -
《Effective Modern C++》条款26:不要和万能引用一起重载
本章节主要讲述关于万能引用重载的一些问题,指出重载的可能问题;关于万能引用可能解决问题的前瞻性讨论:例如,考虑下列函数:vector<string> names;void logAndAdd(const string& name) { auto now = chrono::system_clock::now(); //log(now, "log and add"); names.emplace_back(name);}int main() {原创 2022-04-06 11:33:04 · 556 阅读 · 0 评论 -
《Effective Modern C++》条款24:万能引用以及右值引用
注意一下右值引用和万能引用的区别,之前没有注意过;”万能引用“形式和右值引用类似,但是只存在模板性别推导之中;考虑如下:template<typename T>void fun_t(T&& a) { cout << "template fun" << endl; }以及void fun(A&& a) { cout << "fun done" << endl;}可以看到形式原创 2022-04-02 14:51:10 · 620 阅读 · 0 评论 -
《Effective Modern C++》条款19:shared_ptr相关问题
本章节主要关注于shared_ptr的一些问题;基础问题:首先注意一下shared_ptr和unique_ptr的区别和异同;前者对于相同变量的会存有引用计数,允许多个shared_ptr指向同一个对象;但是需要注意的是,同一个对象指的是某个具体的实例化对象;和unique_ptr类似,shared_ptr也可以使用自定义析构器;class widget {public: ~widget() { cout << "widget delete..." <原创 2022-03-30 15:21:34 · 672 阅读 · 0 评论 -
《Effective Modern C++》条款10:枚举与枚举类
本章节主要关注于enum的问题;之前使用的enum形式来源于C98的用法;C98和C11的enum用法对比:enum Color {black,white,red};通过上述枚举,可以在后续的代码里引用枚举类型;但是存在污染的问题;例如多个文件中可能会对同一枚举字段有多个定义;因此需要采用c11方式来进行类枚举;enum class Color {black,white,red};Color c=Color::white;上述用法又被称为枚举类,形式和类内元素枚举有相同形式;两者不同原创 2022-03-23 16:26:35 · 345 阅读 · 0 评论 -
《Effective Modern C++》条款9:typedef与using别名声明
本章节主要针对了using和typedef的区别进行讨论;using在c++14开始支持别名生命,类似于typedef;例如:typedef long long ll;using ll=long long;两者乍一看毫无区别,但是主要的用途在于复杂类别以及模板型别做声明时有所不同;基础形式:1.typedef的基本形式:typedef的基本形式分为两种:1)简单声明:即简单的声明一个别名;例如:typedef std::unique_ptr<std::unordered_ma原创 2022-03-22 19:43:06 · 520 阅读 · 0 评论 -
《Effective Modern C++》条款8:NULl,0,nullptr的问题
本章节主要讲述了关于空指针判定问题,之前一直没有注意;原则要求:对于指针置空,别用NULL或者0,而是用nullptr;主要问题在于类型转换结果上;0首先会被推断为int,这个没有什么好说;而NULL实际上是0L,即long型别中的0;nullptr实际上是std::nullptr_t,该类型可以隐式转换为其他的指针类;因此对于明文赋值初始化,0和NULL都勉强可以,但是在函数重载和模板上很容易出错;推导下的问题:1.函数重载下:在模板型别下,主要是重载极易出现问题,原因就在于性别判断上原创 2022-03-11 14:59:09 · 356 阅读 · 0 评论 -
《Effective Modern C++》条款7:创建对象区分()和{}
本章节主要探讨变量初始化()和{}的区别和问题;两者的区别和历史遗留问题:从C11起,变量的初始化形式往往有四种:int x(0);int y=0;int z(0);int z={0};对于两者来说,其实并没有太大的区别,但是大家的宗旨是,能用大括号就用大括号;原因如下:1.大括号可以防止“解析语法”:例如:class Widget{ Widget(); Widget(1);}Widegt w();上述看似想创建一个w 的Wideget类型变量,但实际上声明了一个返回W原创 2022-03-10 15:40:25 · 471 阅读 · 0 评论 -
《Effective Modern C++》条款6:auto推导失败以及解决的办法
本章节主要讨论auto作为变量型别推导时会产生错误结果的情况;产生错误的原因:最典型的产生错误的原因是某些变量或者类型使用了代理型别表达式;考虑如下代码:vector<bool>flag(10, 1);auto f = flag[5];bool k = flag[5];按照常理,f和k应该都为bool型,但是实际上f为:这里是所以是reference是因为内部实现的问题;对于std::vector来说,会对bool类型的vector进行压缩,按照比特位来存储布尔值;常原创 2022-03-09 15:07:00 · 1190 阅读 · 0 评论 -
《Effective Modern C++》条款5:别用显式型别声明,能用auto就用auto
本章节主要针对于之前的auto进行了变量声明优化的提出;一、对于变量声明,优先选用auto:原因如下:1.可以避免未定义变量的使用:对于通常变量初始化,可能只是声明而忘了定义,也就是未定义变量;但是对于auto来说,其型别需要来自于传入的变量,因此可以保证每次用auto声明的变量必定已经被初始化;例如:2.对于修改代码可以弹性:例如当修改int类型为long long的时候,就必须要逐行找初始定义类型进行修改;但是如果使用auto,就没有这种问题,只需要重新编译即可;二、使用auto可原创 2022-03-09 14:28:28 · 268 阅读 · 0 评论 -
《Effective Modern C++》条款4:型别推导的查看方法
本章节主要是针对于如何查看编译或者书写过程中如何查看型别推导的结果进行一个陈述;作者推荐使用boost库下的typeid来进行查看;通过本章节发现了自己之前理解条款1,2的一个漏洞;考虑如下代码:struct mywidget {};template<typename T>void f(const T& param);vector<mywidget> createVec();const auto vw = createVec();f(&vw[原创 2022-03-08 16:31:46 · 348 阅读 · 0 评论 -
《Effective Modern C++》条款3:理解decltype
本章节主要关于decltype进行讨论,仍然在条款一和条款二的基础上;一、基本用途:目前综合章节来看,decltype关键字最主要的用途师姐和函数返回值auto进行模板型别推导,如果单独使用可以推导出某个变量的具体类型;1.辅助auto进行返回类型推断:目前主要用于辅助auto,考虑下列代码:template<typename Container,typename Index>auto authAndAccess(Container& c, Index i) { re原创 2022-03-08 16:09:00 · 246 阅读 · 0 评论 -
《Effective Modern C++》条款2:理解auto型别推导
自己之前经常使用auto,认为是python下的类型自动推导,但是从来没想过机制是如何的;auto可以看作另一种模板推导方法,但是由于C++的历史遗留问题,导致过于特殊;基本形式:考虑之前条款一所说的模板推导形式;template<typename T>void f(ParamType param)f(exp)T的类型由ParamType和exp共同决定,从而引出三个条款;但是auto也不例外;例如:const auto& x=3;可以分开来看:1.aut原创 2022-03-07 23:20:50 · 308 阅读 · 0 评论 -
《Effective Modern C++》条款1:模板类型推导
本章节主要针对于template的类型推到进行一个简介;对于一下template模板:template<typename T> void fun(ParamType param);fun(expr);以往自己认为T的类型是由expr来决定的,之后作用于ParamType,但是今天看了这张发现自己的理解有点问题;事实情况是T的类型是什么取决于ParamType以及expr的具体形式,并不是孤立存在的;因此,T的类型不仅取决于expr的类型,也取决于ParamType的类型;本章原创 2022-03-04 19:32:10 · 395 阅读 · 0 评论