Effective Modern C++:02auto】的更多相关文章

05:优先使用auto,而非显示类型声明 显示类型声明有下面一些缺点: int x; //未初始化,或者初始化为0,视语境而定 template<typename It> void dwim(It b, It e) { while (b != e) { typename std::iterator_traits<It>::value_type //啰嗦 currValue = *b; … } } 另外,如果想要使用闭包的类型来声明变量,但是闭包的类型只有编译器知道. 有了auto之…
裸指针有着诸多缺点:裸指针的声明中看不出它指向的是单个对象还是数组:裸指针的声明中也无法看出使用完它指向的对象后是否需要删除,也就是声明中看不出裸指针是否拥有其指向的对象:即使知道要析构裸指针指向的对象,也不可能知道如何析构才是恰当的:即使确知要使用delete来析构,也无法判定到底使用delete还是delete[]:使用裸指针也无法保证在程序多个代码路径上仅执行一次析构,不执行析构会造成内存泄漏,多次析构又会产生未定义行为:无法判断出裸指针是否是空悬指针. 智能指针的提出,就是用来解决裸指针…
07:在创建对象时注意区分()和{} 自C++11以来,指定初始化值的的方式包括使用小括号,等号,以及大括号: ); // initializer is in parentheses ; // initializer follows "=" }; // initializer is in braces }; // initializer uses "=" and braces C++将后两种使用大括号的两种方式视为相同的方式. C++11之前,单纯的直接初始化和复制…
C++的官方钦定版本,都是以ISO标准被接受的年份命名,分别是C++98,C++03,C++11,C++14,C++17,C++20等.C++11及其后续版本统称为Modern C++. C++11之前,仅有一套类型推导规则,也就是函数模板的推导.C++11之后,又增加了了auto和decltype的推导规则.模板推导规则是auto的基础. 首先需要介绍顶层const和底层const 的概念:指针本身是不是常量以及指针所指的对象是不是一个常量,这是两个相互独立的问题.顶层const(top-le…
41:针对可复制的形参,在移动成本低且一定会被复制的前提下,考虑将其按值传递 class Widget { public: void addName(const std::string& newName) { names.push_back(newName); } void addName(std::string&& newName) { names.push_back(std::move(newName)); } … private: std::vector<std::st…
C++11的志伟功勋之一,就是将并发融入了语言和库中,因此在C++的历史上,程序员可以首次跨越所有平台撰写具有标准行为的多线程程序. 35:优先选用基于任务而非基于线程的程序设计 如果需要以异步的方式运行函数doAsyncWork,有两种选择,基于线程的方法(使用std::thread)和基于任务(使用std::async)的方法: int doAsyncWork(); std::thread t(doAsyncWork); auto fut = std::async(doAsyncWork);…
lambda表达式实际上是语法糖,任何lambda表达式能做到的,手动都能做到,无非是多打几个字.但是lambda作为一种创建函数对象的手段,实在太过方便,自从有了lambda表达式,使用复杂谓词来调用STL中的”_if”族算法(std::find_if,std::remove_if等)变得非常方便,这种情况同样发生在比较函数的算法族上.在标准库之外,lambda表达式可以临时制作出回调函数.接口适配函数或是语境相关函数的特化版本以供一次性调用.下面是关于lambda相关术语的提醒: lambd…
移动语义使得编译器得以使用成本较低的移动操作,来代替成本较高的复制操作:完美转发使得人们可以撰写接收任意实参的函数模板,并将其转发到目标函数,目标函数会接收到与转发函数所接收到的完全相同的实参.右值引用是将这两个不相关的语言特性连接起来的底层语言机制,正是它使得移动语义和完美转发成了可能. 23:理解std::move和std::forward std::move并不进行任何移动,std::forward也不进行任何转发.这两者在运行期都无所作为,它们不会生成任何可执行代码.实际上,std::m…
/*********************************************************** 关于书: 书是我从网上找到的effective Modern C++的样章,内容只到条款4就没有了, 所以现阶段我只能翻译到条款4,不过以后有机会我会继续翻译的. 如果读者找到了完整的版本,欢迎大家发给我.1021842556@qq.com effective Modern C++的样章的下载地址http://pan.baidu.com/s/1ntKBlpf 提取密码是upk…
本文记录了我读Effective Modern C++时自己的一些理解和心得. item1:模板类型推导 1)reference属性不能通过传值参数传入模板函数.这就意味着如果模板函数需要一个reference类型的参数,必须在模板声明中将其声明为reference,否则,即使使用一个reference类型的变量调用模板函数,类型推导的结果将不带reference属性. 2)constant和volatile属性也不能通过传值参数传入模板函数,但是可以通过reference参数传入这些属性. 3…