本文翻译自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++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 如果你为其他开发者提供代码,并且你想阻止他们调用一个特定的函数,你通常不会声明这个函数.函数不声明,函数就不会被调用.太简单了!但是有时候C++会帮你声明函数,并且如果你想要阻止客户调用这些函数,简单的事情就不再简单了. 这种情况只发生在"特殊的成员函数"身上,也就是,当你需要这些成员函数的时候,C++会自动帮你生成.Item 17详细地讨论了这些函数,…
本文翻译自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++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 一般情况下,在花括号中声明一个name(包括变量名,函数名),这个name的可见性会被限制在花括号的作用域内.对于在C++98风格的enum中声明的enum成员却不是这样.这些enum成员的name属于的作用域是enum所在作用域,这意味着在这个作用域中,不能拥有相同的name: enum Color { black, white, red }; //black,…
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 啊,简单愉快的代码: int x; 等等,讨厌!我忘了初始化x,所以它的值是不确定的.可能,它可能被初始化成了0,这取决于你的编译环境.哎. 不要紧,让我们简单并愉快地声明一个局部变量,通过解引用一个iterator来初始化它: template<typename It> void dwim(It b, It e) { while(b != e){ typena…
Effective STL 学习笔记 Item 21:Comparison Function 相关 */--> div.org-src-container { font-size: 85%; font-family: monospace; } Table of Contents 1. Always have comparison functions return false for equal values 2. Strict Weak Ordering 1 Always have compar…
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 我确信我们都同意使用STL容器是一个好主意,并且我希望在Item 18中能让你相信使用std::unique_ptr也是一个好主意,但是我猜想,我们中没有任何一个人想多次写这样的类型:"std::unique_ptr<std::unordered_map<std::string, std::string>>".光是想想就感觉,得&…
本文翻译自<effective modern C++>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 根据std::move和std::forward不能做什么来熟悉它们是一个好办法.std::move没有move任何东西,std::forward没有转发任何东西.在运行期,它们没有做任何事情.它们没有产生需要执行的代码,一byte都没有. std::move和std::forward只不过就是执行cast的两个函数(实际上是函数模板).std::move无…
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 先让我们看一些概念:字面上的0是一个int,不是一个指针.如果C++发现0在上下文中只能被用作指针,它会勉强把0解释为一个null指针,但这只是一个应变的方案.C++的主要规则还是把0视为int,而不是一个指针. 实际上,NULL也是这样的.NULL的情况,在细节方面有一些不确定性,因为C++标准允许它的实现不管是不是int只需要给出一个数值类型(比如,long)…
本系列作为Effective JavaScript的读书笔记. 以下是一个拥有可变參数列表的方法的典型样例: average(1, 2, 3); // 2 average(1); // 1 average(3, 1, 4, 1, 5, 9, 2, 6, 5); // 4 average(2, 7, 1, 8, 2, 8, 1, 8); // 4.625 而下面则是一个仅仅接受一个数组作为參数的样例: averageOfArray([1, 2, 3]); // 2 averageOfArray([…