首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++20新特性个人总结

,新增自定义查找规则  2.17  放宽基于范围for循环,新增自定义范围方法  2.18  类类型非类型模板参数  关于类类型非类型模板参数优化  类类型非类型模板参数条件(满足任意一个)...  聚合初始推导类模板参数  2.28  隐式地将返回本地变量转换为右值引用  2.29  允许default修饰运算符按值比较  2.30  非类型模板参数等效条件  3  宏  4  属性 ...这个特性GCC、MSVC编译器早已实现,但在其他编译器以前版本并未实现。  我理解是,模板类内,可以忽略访问权限而访问到其他类内嵌套类。 ...循环,新增自定义范围方法  以前版本自定义for循环,需要实现begin()和end()成员函数;新版本开始,可以不实现成员函数,而在类体外实现begin()和end(),具体看以下例子  例子...  因为模板参数是处于编译期计算,因此,作为调用用于自定义类型模板参数成员函数时,这些成员必须是constexpr修饰

1.9K50

【笔记】《C++Primer》—— 第三部分:类设计者工具

默认情况下lambda表达式不能改变它捕获变量因为它函数调用运算符被重载为const 标准库functional定义了一系列表示算术运算符,赋值运算符和默认析构函数模板类,我们可以这些类替换掉默认运算符改变容器操作...我们一样可以自定义所需类型转换运算符方法是一个没有返回类型也没有形参必须定义为成员函数operator type() const函数 尽管编译器对一个对象一次只进行一次自定义类型转换,但这个转换还可以放在一次内置转换之前或之后...,派生类一般构造函数开始地方调用基类构造函数,让基类来初始自己成员 静态类型是变量本身代码类型,在编译时决定,动态类型是变量在内存对象类型,在运行时才能决定。...,我们可以尾置返回来完成这个目标: 标准库头文件type_traits类来进行特殊类型转换能够动态地将这些语言特性消去从传入参数中提取出我们想要类型 编译器是从模板函数调用推断具体实参类型要求...forward函数,能恢复被右值引用参数去除右值引用属性 没有歧义情况下,永远会调用发生了最少改变,最精确匹配,最不需要调用自定义类型转换,最不需要调用模板那个重载,即“更特例” 可变参数模板就是一个能接受数目可变类型也可变参数

1.7K10
您找到你想要的搜索结果了吗?
是的
没有找到

C++20初体验——concepts

如果我们自己写模板函数对类型有要求,可以模板参数列表写出: #include template void...是等价(==)关系 strict_weak_order 是严格弱序(<)关系 对于最后两个concept,除了有各种可调用函数需求以外,==运算符必须满足自反性与对称性,<运算符也类似。...函数模板与类模板约束是类似的,只有满足约束时模板才能实例;对于成员函数约束,如果它作用于模板模板参数,当约束不满足时,并不是类模板不能被实例,而是实例模板类没有这个成员函数: #include...下面我们要根据一个类可比较性调用不同实现,分为两步:function_eq_comp定义了value指示模板参数T类型两个实例是否可以operator==比较,function_object_compare...,one test(int)函数正确定义,test函数返回类型将会是one,value为true,否则one test(int)错误,根据SFINAE,test调用落入two test(...)

1.3K10

C++最佳实践 | 1. 工具

2 对输出格式函数(即printf)安全问题发出警告 -Wlifetime 显示对象生命周期问题(目前只有Clang特殊分支) 考虑使用-Weverything,并且只需要情况下禁用少数警告。.../w14546 逗号前函数调用缺少参数列表 /w14547 'operator': 逗号前运算符无效,预期运算符有副作用 /w14549 'operator': 逗号前运算符无效,想要“运算符”...,已隐式应用多个用户定义转换 不建议 /Wall 会对标准库包含文件发出警告,有太多额外警告,因此没什么。...通用 一开始就设置非常严格警告,项目开始后试图提高警告级别可能会很痛苦。 考虑使用将警告视为错误设置,例如MSVC/Wx,以及GCC/Clang-Werror。...PVS-Studio PVS-Studio[50]是用于检测C、C++和C#编写程序源代码bug工具,对个人学术项目、开源非商业项目和个人开发者独立项目都是免费,可以Windows和Linux

3.3K10

第 13 章 拷贝控制

花括号列表初始一个数组元素或一个聚合类成员 标准库容器插入元素(insert、push)时,会对元素进行拷贝;而 emplace则是进行直接初始 拷贝初始过程,编译器可以(但不是必须...编译器略过了拷贝构造函数 一个构造函数,成员初始函数体执行之前完成,且按照它们类中出现顺序进行初始。...重载拷贝赋值运算符时,要注意处理自赋值情况,一个较好方法销毁左侧运算对象之前先拷贝右侧运算对象。 拷贝一个像值对象时,副本和原对象是完全独立。...而如果该类对象没有定义 swap函数,则会调用标准库模板函数。...使用 move代码应该使用 std::move,而不是 move,这是因为具有转换为右值引用功能函数就是标准库函数模板,而不使用 std,则可能引起潜在名字冲突。

97150

【笔记】《C++Primer》—— 第14章:重载运算和类型转换

而是否有默认拷贝/移动函数要视捕获数据成员类型而定 标准库functional定义了一系列表示算术运算符,赋值运算符和默认析构函数模板类,我们可以这些类来实现简单类计算或将其作为可调用对象传递到一些容器替换掉默认运算符改变容器操作...FOO(); 但是要注意我们不能将参数不同但名称相同调用对象之间存入function,因为会产生二义性,解决方法是使用函数指针处理 14.9 重载,类型转换运算符 我们一样可以自定义所需类型转换运算符...将类往bool类型进行转换是最常见一种做法,但是由于转到bool类型很可能表达并不是简单数据语义,所以C11加入了显式类型转换来限制它,方法转换函数前加上explicit,这样编译器就不会隐式进行这个转换...,也就是我们必须使用强制类型转换才能使用 但是对于bool特殊对待,一些条件表达,例如if,for,逻辑运算符和三目运算符,bool转换会自动进行显式转换 对类进行隐式类型转换最好尽量避免,因为语义常常比较模糊...,也就是当我们表达式中使用了目标是内置类型类型转换时,需要考虑接下来要使用运算符到底是内置还是我们自定义运算符,这也很容易引起二义性问题

64010

C++-入门语法(一)

C++ 发展历史 语法须知 C++源文件扩展名是:cpp(c plus plus简称) C++程序入口是main函数函数方法,一个意思) C++完全兼容C语言语法,很久以前,C++叫做C...with classes cin与cout C++中常使用cin、cout进行控制台输入、输出 cin右移运算符>>,cout是左移运算符<< endl是换行意思 #include using namespace std; // Java世界里,先有类,再有方法函数) int main() { //cout << "Hello World!"...) 规则 函数名相同 参数个数不同、参数类型不同、参数顺序不同 注意 返回值类型与函数重载无关 调用函数时,实参隐式类型转换可能会产生二义性 本质:采用了name mangling或者叫name...C语言方式去编译 如果函数同时有声明和实现,要让函数声明被extern "C"修饰,函数实现可以不修饰 由于C、C++编译规则不同,C、C++混合开发时,可能会经常出现以下操作 C++调用C语言

38700

令人沮丧C++性能调试

假设你完全不关心调试性能……好吧,猜猜怎么着——所有上述实用函数都会导致函数模板实例,从而降低编译速度。...我们可以说函数模板不是为强制转换和位操作创建轻量级抽象正确模型,类模板和轻量级类型,如 std::vector::iterator,也是如此。...可惜是,这篇论文几年来都没有更新。 即使我们设法语言中引入了“卫生宏”,也无助于现有的实用函数,这些实用函数在过去已经被标准化为函数和类模板——也就是说,它不会让 std::move 变得更好。...MSVC 还没有在这方面提供任何改进。 我必须说,看到 GCC 和 Clang 维护人员逐步改进调试性能,我感到非常高兴,也非常感谢他们。 无论如何,我不认为硬编码函数正确解决方案。...我希望在这方面看到一些进展——也许强制转换替换一些 std::move 和 std::forward 调用,并在合适位置添加一些属性,让整个 C++ 社区受益。

94920

Google C++ 编程风格指南(五):其他 C++ 特性

测试框架里很好用。 缺点: 现有函数添加 throw 语句时,您必须检查所有调用点。要么让所有调用点统统具备最低限度异常安全保证,要么眼睁睁地看异常一路欢快地往上跑,最终中断掉整个程序。...缺点: const 是入侵性: 如果你向一个函数传入 const 变量, 函数原型声明也必须对应 const 参数 (否则变量需要 const_cast 类型转换), 调用函数时显得尤其麻烦....优点: 如今 constexpr 就可以定义浮点式真・常量,不用再依赖字面值了;也可以定义用户自定义类型上常量;甚至也可以定义函数调用所返回常量。...缺点: 若过早把变量优化成 constexpr 变量,将来又要把它改为常规变量时,挺麻烦;当前对constexpr函数和构造函数中允许限制可能会导致这些定义解决方法模糊。...for (int i : {-1, -2, -3}) {} // 函数调用列表初始

1.1K30

c++:动态库接口函数返回stl对象设计原则塈‘__acrt_first_block == header’异常

std::string是STL定义模板类,所以编译器在编译动态库时会将std::string实例,在编译exe时也会将其实例,也就是说有两套std::string实例代码分别在exe和dll....main结束时要析构result,会调用exe实例std::string析构函数代码来释放内存,然后就会抛出__acrt_first_block == header异常。...()返回类型改为class A,这样以来exe就不再直接析构std::string,而是析构dllclass A,class A析构成员时就能正确释放在当前dllheap分配内存了。...如果为每个需要封装类型都定义一个class A也够烦,所以可以把这个class A设计成一个模板类raii_dll,它不干别的,只是为了正确释放dll或exe对象。...(可以照搬本文方法) 动态库接口函数输入/出参数如果是class,应尽量设计为常量引用(const &),不允许被修改。

4.2K30

查看自动类型推导结果方法

++代码转换成最终形式C++代码,有点类似于C/C++预处理器一样,把一些宏代码替换成真实代码一样,但它功能更进一步也更强大,该工具支持基于范围循环、结构绑定、生成默认构造函数、初始列表、...auto与decltype转换成真实类型,最强大是会生成模板实例代码,这些功能对于调试C++代码非常有用。...需要注意是,这个工具我发现了一个Bug,就是上面代码T9类型别名,正确类型应该是func函数类型:int(int, int),这里显示为它返回值类型了。...这时可以采用另外一种手段来输出变量类型,跟上小节例子一样借助模板技术,实现一个模板函数模板函数利用编译器提供宏,把这个函数原型打印出来,函数原型中就包含了函数参数个数及其类型,这个宏由于不是...C++标准定义,是由各编译器扩展,因此名称不一样,GCC/Clang是__PRETTY_FUNCTION__,微软MSVC是__FUNCSIG__,如下代码:#include <iostream

7710

【C++系列(合集)】特性多又复杂?不存在!——这篇C++大全直接干碎(超级大全,精讲)

(使通讯录代码更简洁) 1.不适用场景: 适用场景:(静态区栈帧不销毁) 2.实际应用 通讯录传统方法,需要“查找"到对应pos位置后再“修改” 而运用“引用作为返回值”,可直接对查找到值进行修改...五.成员变量初始列表初始顺序 成员变量声明次序就是其初始列表初始顺序,与其初始列表先后次序无关 图示: 11.类六个默认成员函数 当没有显式定义(我们不主动写时...(注意点:内置类型成员变量直接赋值,只有自定义成员变量需要调用对应赋值运算符重载) 6.取地址与取地址重载 引入: 内置类型取地址时有取地址操作符,而自定义类型呢?于是出现了取地址重载。...T确定为int 或者 double类型而报错 解决方式: 用户自己强制类型转换 显式实例 2.显式实例 显式实例函数名后中指定模板参数实际类型 代码演示: int main(...C++实现封装,可以通过类和操作数据方法进行结合,通过访问权限(访问限定符)来隐藏对象内部实现细节,控制哪些方法可以类外部直接被使用。

14310

第 16 章 模板与泛型编程

模板中使用到类型相关函数运算符应尽可能少。 为了生成一个实例版本,编译器需要掌握函数模板或类模板成员函数定义。...相同模板实参实例友元是该类友元,可以访问非 public部分,而对于其他实参实例实例则没有特殊访问权限。...与往常一样,可行函数模板与非模板)按类型转换(如果对此调用需要的话)来排序。当然,可以用于函数模板调用类型转换是非常有限。...如果同样好函数没有非模板函数,而有多个函数模板,且其中一个模板比其它模板更特例则选择此模板。 否则,此调用有歧义。...一个类模板部分特例本身是一个模板,使用它时用户还必须为那些特例版本未指定模板参数提供实参。只能部分特例模板,而不能部分特例函数模板

1.4K20

第 16 章 模板与泛型编程

模板中使用到类型相关函数运算符应尽可能少。 为了生成一个实例版本,编译器需要掌握函数模板或类模板成员函数定义。...相同模板实参实例友元是该类友元,可以访问非 public部分,而对于其他实参实例实例则没有特殊访问权限。...与往常一样,可行函数模板与非模板)按类型转换(如果对此调用需要的话)来排序。当然,可以用于函数模板调用类型转换是非常有限。...如果同样好函数没有非模板函数,而有多个函数模板,且其中一个模板比其它模板更特例则选择此模板。 否则,此调用有歧义。...一个类模板部分特例本身是一个模板,使用它时用户还必须为那些特例版本未指定模板参数提供实参。只能部分特例模板,而不能部分特例函数模板

1.4K60

【笔记】《Effective C++》条款1-25

那么对于那些赋值和直接初始效果一样好(例如那些需要借助数据库进行真正初始成员)则应该移进一个统一特殊函数(Setup函数), 然后构造函数调用这个函数 对于static成员又要注意, C...析构函数尽管调用顺序相反但是思路一致 所以不要在析构/构造过程调用函数 补偿方法是将需要让派生类执行函数以非虚函数形式写好, 然后将其所需变量通过构造函数构造初值列中进行传递...., 最好令重载赋值运算符以引用形式返回*this 这只是个协议, 但最好遵守 11 operator=处理"自我赋值" 当对象存在指针申请空间时, 赋值运算符我们一般都会释放旧空间, 然后创建一份和待复制内存相同内存...正确做法是额外写一个init函数包含通用代码, 然后让两个拷贝函数调用它来初始 3 资源管理 13 以对象管理资源 资源获取时机便是初始管理对象时机(Resource Acquisition...24 若所有参数皆需类型转换, 请为此采用non-member函数 只有当参数被列于参数列时, 这个参数才能参与隐式类型转换(*this不算在内) 当一个函数所有参数都需要进行类型转换时(时常发生在运算符重载函数

99030

模板(上)——(函数模板

当编译系统程序中发现有与函数模板相匹配函数调用时,便产生一个重载函数,该重载函数函数体与函数模板函数体相同,该重载函数就是模板函数。...将数据类型形参实例参数称为模板实参,模板实参实例函数就是模板函数模板函数生成就是将函数模板类型形参实例过程。...自定义参数类型 可以函数模板“形参表”和对模板函数调用中使用类类型和其他用户定义类型。如果这样,就必须在类设计重载运算符,以便模板函数能对类变量进行正确运算,否则就会出现错误。...(2)(1)失败后,寻找一个函数模板,使其实例,产生一个匹配模板函数,若找到了就调用它。...(3)(1)(2)均失败后,再试试低一级函数重载方法,例如通过类型转换可产生参数匹配,若找到了就调用它。

1.5K20

运算符重载基本规则和习惯用法是什

运算符重载通用语法 重载时,你不能更改 C++ 内置类型运算符含义,只能对自定义类型[1]运算符进行重载。也就是,运算符两边操作数至少有一个是自定义类型。...., Nov, Dec} 你想为它重载递加和递减运算符,但是你是无法实现它们为成员函数,因为 C++ ,枚举类型压根就没有成员函数这一说。...还有,对于嵌套在类模板模板,operator<() 作为内联成员函数会更方便去读写成员变量,但这种情况不是经常能遇到。 普通运算符重载用法 重载运算符大部分代码都是固定。...new 表达式(比如new T(arg))时候,实际上做了两步, 调用operator new申请内存 调用 T 构造函数初始内存区 同样地,当调用 delete 表达式(比如delete p)...如果你提供上述函数自己版本,那么你版本会替换掉标准库版本,实际调用时候会调用版本。

71510

【笔记】《C++Primer》—— 第16章:模板与泛型编程

模板分为函数模板和类模板两种,都可以通过参数形成特定代码 函数模板编写方法函数template附注模板参数列表,然后这里声明类型T可以被使用到函数是参数和定义...,模板实参推断过程,编译器用函数调用实参类型来查找哪些函数版本最为匹配 对于函数模板与普通非模板函数不太一样,编译器通常不对实参进行类型转换从而只有几个类型转换会应用在实参上,编译器偏向于生成新模板实例来适配...,因为并不会自动转换适配 即使是模板函数,对于其中被指定类型则仍会进行以前正常类型转换 如果模板实参不会出现在函数实参(例如模板实参对应着函数返回值类型),则我们可以调用函数时像实例模板一样尖括号按顺序指定所需实参...我们返回正确类型时进行了强制类型转换static_cast,这里要注意是有另一个特例,我们不能隐式将左值转为右值引用,但是可以static_cast显式转换且这个这个对左值截断是安全 看了move...上面复杂规则总结起来就是“更特例”,没有歧义情况下,永远会调用发生了最少改变,最精确匹配,最不需要调用自定义类型转换(内置类型转换优先级更高),最不需要调用模板那个重载 当编译器缺少一个合适重载函数

1.5K30
领券