modern effective C++ -- Deducint Types】的更多相关文章

1. 理解模板类型推导 1. expr是T& template<typename T> void f(T & param); // 我们声明如下变量 int x = 27; const int cx = x; const int& rx = x; 函数调用时,推导出的Param和T的类型如下: f(x); // T is int, param's type is int& f(cx); // T is const int, param's type is con…
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 如果说C++11中有什么新东西能拿"最佳困惑奖"的话,那肯定是constexpr了.当把它用在对象上时,它本质上是const的加强版,但是把它用在函数上时,它将拥有不同的意义.切开"迷雾"(解开困惑)是值得的,因为当constexpr符合你想表达的情况时,你肯定会想要使用它的. 从概念上来说,constexpr表明的一个值不只是不变的…
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 让我们先从std::make_unique和std::make_shared的对比开始吧.std::make_shared是C++11的部分,但是,不幸的是,std::make_unique不是.它是在C++14中才被加入到标准库的.如果你使用的是C++11,不要怕,因为一个std::make_unique的基础版本很容易写.看这里: template<typen…
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 矛盾的是,我们很容易就能创造出一个和std::shared_ptr类似的智能指针,但是,它们不参加被指向资源的共享所有权管理.换句话说,这是一个行为像std::shared_ptr,但却不影响对象引用计数的指针.这样的智能指针需要与一个对std::shared_ptr来说不存在的问题做斗争:它指向的东西可能已经被销毁了.一个真正的智能指针需要通过追踪资源的悬挂(也…
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 使用带垃圾回收机制语言的程序员指出并嘲笑C++程序员需要遭受防止资源泄漏的痛苦."多么原始啊"他们嘲笑道,"20世纪60年代的Lisp留下的备忘录你还不记得了吗?机器(而不是人类)应该管理资源的生命周期".C++开发人员转了转他们的眼睛,"你所说的备忘录是指,那些资源只有内存以及资源的回收时间不确定的时候吗?我们更喜欢比较普…
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 当你需要一个智能指针的时候,std::unique_ptr通常是最接近你需求的那一个.默认情况下,这么假设是很合理的:std::unique_ptr和原始指针的大小是一样的,并且很多操作(包括解引用),它们执行的是完全相同的指令.这意味着你甚至能把它们用在对内存和时间都很紧的地方.如果一个原始指针对你来说足够的小和快,那么一个std::unique_ptr也几乎可…
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 C++的官方说法中,特殊成员函数是C++愿意去主动生成的.C++98有4个这样的函数:默认构造函数,析构函数,拷贝构造函数,拷贝operator=.当然,这里有些细则.这些函数只在需要的时候产生,也就是,在类中如果一些代码没有清楚地声明它们就使用了它们.一个默认构造函数只有在类中没有声明任何构造函数的情况下才会被生成出来(当你的目的是要求这个类的构造函数必须提供参…
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 如果我们在数学领域里工作,我们可能会发现用一个类来表示多项式会很方便.在这个类中,如果有一个函数能计算多选式的根(也就是,多项式等于0时,各个未知量的值)将变得很方便.这个函数不会改变多项式,所以很自然就想到把它声明为const: class Polynomial{ public: using RootsType = //一个存放多项式的根的数据结构 std::v…
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 在C++98中,异常规范(exception specifications)是一个不稳定因素.你必须总结出一个函数可能会抛出的异常类型,所以如果函数的实现被修改了,异常规范可能也需要被修正.改变异常规范则又可能影响到客户代码,因为调用者可能依赖于原先的异常规范.编译器通常不会提供帮助来维护"函数实现,异常规范以及客户代码"之间的一致性.最终,大多数程序员…
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 STL中的const_iterator等价于pointers-to-const(指向const值的指针).它们指向的值不能被修改.使用const的标准做法是,每当你不需要修改iterator指向的值的时候,你都应该使用const_iterator. 这对C++98和C++11来说都是对的,但是在C++98中,const_iterator只能算勉强支持.我们无法简单…
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 C++中的面向对象编程总是围绕着类,继承,以及虚函数.这个世界中,最基础的概念就是,对于一个虚函数,用派生类中的实现来重写在基类中的实现.但是,这是令人沮丧的,你要认识到重写虚函数有多么容易出错.这就好像这部分语言,是用这样的概念(墨菲定律不仅仅要被遵守,更需要被尊敬)来设计的.(it's almost as if this part of the languag…
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 如果你为其他开发者提供代码,并且你想阻止他们调用一个特定的函数,你通常不会声明这个函数.函数不声明,函数就不会被调用.太简单了!但是有时候C++会帮你声明函数,并且如果你想要阻止客户调用这些函数,简单的事情就不再简单了. 这种情况只发生在"特殊的成员函数"身上,也就是,当你需要这些成员函数的时候,C++会自动帮你生成.Item 17详细地讨论了这些函数,…
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 一般情况下,在花括号中声明一个name(包括变量名,函数名),这个name的可见性会被限制在花括号的作用域内.对于在C++98风格的enum中声明的enum成员却不是这样.这些enum成员的name属于的作用域是enum所在作用域,这意味着在这个作用域中,不能拥有相同的name: enum Color { black, white, red }; //black,…
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 我确信我们都同意使用STL容器是一个好主意,并且我希望在Item 18中能让你相信使用std::unique_ptr也是一个好主意,但是我猜想,我们中没有任何一个人想多次写这样的类型:"std::unique_ptr<std::unordered_map<std::string, std::string>>".光是想想就感觉,得&…
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 先让我们看一些概念:字面上的0是一个int,不是一个指针.如果C++发现0在上下文中只能被用作指针,它会勉强把0解释为一个null指针,但这只是一个应变的方案.C++的主要规则还是把0视为int,而不是一个指针. 实际上,NULL也是这样的.NULL的情况,在细节方面有一些不确定性,因为C++标准允许它的实现不管是不是int只需要给出一个数值类型(比如,long)…
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 从不同的角度来看,在C++11中,对象初始化拥有多种语法选择,这体现了语法丰富造成的尴尬或者烂摊子.一般情况下,初始化的值可以用圆括号,等号,花括号来确定: int x(0); //用圆括号初始化 int y = 0; //用"="初始化 int z{ 0 }; //用花括号初始化 在很多情况下,也可以使用等号加花括号的形式: int z = { 0 }…
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 啊,简单愉快的代码: int x; 等等,讨厌!我忘了初始化x,所以它的值是不确定的.可能,它可能被初始化成了0,这取决于你的编译环境.哎. 不要紧,让我们简单并愉快地声明一个局部变量,通过解引用一个iterator来初始化它: template<typename It> void dwim(It b, It e) { while(b != e){ typena…
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 对于推导类型结果的查看,根据不同的软件开发阶段,你想知道的信息的不同,可以选择不同的工具.我们将探讨三种可能性:在你编辑代码时获得类型推导信息,在编译期获得信息,在运行期获得信息. IDE 编辑器 在IDE中编辑代码常常能显示程序实体(比如,变量,参数,函数等)的类型,只需要你做一些像把光标放在实体上面之类的事.举个例子,给出这样的代码: const int th…
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 decltype是一个奇怪的东西.给出一个名字或者一个表达式,decltype可以告诉你名字或表达式的类型.大多情况下,他告诉你的就是确实你想的那样.但是偶尔,他会提供一个脱离你想象的结果,这导致了你必须去找一本参考书或者去在线Q&A网站寻求答案. 我们从一般情况(没有意外的结果)开始.对比template和auto的类型推导,decltype模仿你给的名字或表达…
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 如果你已经读过item 1的模板类型推导,你已经知道大部分关于auto类型推导的知识了,因为,除了一种奇怪的情况外,auto类型推导和template类型推导是一样的.但是为什么会这样?template类型推导涉及模板和函数以及参数,但是auto没有处理这些东西. 是这样的,但是这没关系.从template类型推导到auto类型推导有一个直接的映射关系.这里有一个…
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 一些用户对复杂的系统会忽略它怎么工作,怎么设计的,但是很高兴去知道它完成的一些事.通过这样的方式,c++中的template类型的推导取得了巨大的成功.数以万计的程序员曾传过参数给template函数,并得到了满意的结果.尽管很多那些程序员很难给出比朦胧的描述更多的东西,比如那些被推导的函数是怎么使用类型来推导的. 如果你也是其中的一员,我这有好消息和坏消息给你.好消息是templat…
如果不使用任何同步机制(例如 mutex 或 atomic),在多线程中读写同一个变量,那么,程序的结果是难以预料的.简单来说,编译器以及 CPU 的一些行为,会影响到程序的执行结果: 即使是简单的语句,C++ 也不保证是原子操作. CPU 可能会调整指令的执行顺序. 在 CPU cache 的影响下,一个 CPU 执行了某个指令,不会立即被其它 CPU 看见. 利用 C++ 的 atomic<T> 能完成对象的原子的读.写以及RMW(read-modify-write),而参数 std::m…
条款6 当推断意外类型时使用显式的类型初始化语句 基础知识 当使用std::vector<bool>的时候,类型推断会出现问题: std::vector<bool> features(const Widget& w); // OK ]; processWidget(w, highPriority); // ERROR auto highPriority = features(w)[]; processWidget(w, highPriority); // undefined…
条款四 知道如何看待推断出的类型 基础知识 有三种方式可以知道类型推断的结果: IDE编辑器 编译器诊断 运行时输出 使用typeid()以及std::type_info::name可以获取变量的类型信息,但是存在一些问题,代码如下: template<typename T> void f(const T& param) { using std::cout; cout << "T = " << typeid(T).name() <<…
本文记录了我读Effective Modern C++时自己的一些理解和心得. item1:模板类型推导 1)reference属性不能通过传值参数传入模板函数.这就意味着如果模板函数需要一个reference类型的参数,必须在模板声明中将其声明为reference,否则,即使使用一个reference类型的变量调用模板函数,类型推导的结果将不带reference属性. 2)constant和volatile属性也不能通过传值参数传入模板函数,但是可以通过reference参数传入这些属性. 3…
/*********************************************************** 关于书: 书是我从网上找到的effective Modern C++的样章,内容只到条款4就没有了, 所以现阶段我只能翻译到条款4,不过以后有机会我会继续翻译的. 如果读者找到了完整的版本,欢迎大家发给我.1021842556@qq.com effective Modern C++的样章的下载地址http://pan.baidu.com/s/1ntKBlpf 提取密码是upk…
北京时间2016年1月9日10:31:06.正式開始翻译.水平有限,各位看官若有觉得不妥之处,请批评指正. 之前已经有人翻译了前几个条目,有些借鉴出处:http://www.cnblogs.com/magicsoar/p/3966177.html?utm_source=tuicool&utm_medium=referral 如今就開始<Effective Modern C++>翻译之旅,第一个姿势--简单介绍 Introduction 假设您是一位专家级别的C++project师,和我…
写了非常多关于C++11的博客.总是认为不踏实,非常多东西都是东拼西凑.市场上也非常少有C++11的优秀书籍,但幸运的是Meyers老爷子并没有闲赋.为我们带来了<effective modern c++>. 我们都要认清,一个人非常难超越自我,超越自我的巅峰之作.由于不同的时代.也会早就不同的伟大作品. 说上面这段话的意思就是,我们不能期待<effective modern c++>能达到<effective c++>给我们带来的惊喜,可是也是出自大师之手. Lear…
07:在创建对象时注意区分()和{} 自C++11以来,指定初始化值的的方式包括使用小括号,等号,以及大括号: ); // initializer is in parentheses ; // initializer follows "=" }; // initializer is in braces }; // initializer uses "=" and braces C++将后两种使用大括号的两种方式视为相同的方式. C++11之前,单纯的直接初始化和复制…
Item 1: Understand template type deduction. Item 2: Understand auto type deduction. Item 3: Understand decltype. Item 4: Know how to view deduced types. Item 5: Prefer auto to explicit type declarations. Item 6: Use the explicitly typed initializer i…