本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 STL中的const_iterator等价于pointers-to-const(指向const值的指针).它们指向的值不能被修改.使用const的标准做法是,每当你不需要修改iterator指向的值的时候,你都应该使用const_iterator. 这对C++98和C++11来说都是对的,但是在C++98中,const_iterator只能算勉强支持.我们无法简单…
条目二十六<iterator优先于const_iterator.reverse_iterator以及const_reverse_iterator> 这几个东西不是类型来的,而是不同的类,所以强制转换的话是不行的,所以别把C风格的强制转换类型用在这里. 它们之间存在着隐式转换. iterator -> const_iterator iterator -> reverse_iterator const_iterator -> const_reverse_iterator 或者显示…
本文翻译自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++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 一般情况下,在花括号中声明一个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…
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 先让我们看一些概念:字面上的0是一个int,不是一个指针.如果C++发现0在上下文中只能被用作指针,它会勉强把0解释为一个null指针,但这只是一个应变的方案.C++的主要规则还是把0视为int,而不是一个指针. 实际上,NULL也是这样的.NULL的情况,在细节方面有一些不确定性,因为C++标准允许它的实现不管是不是int只需要给出一个数值类型(比如,long)…
1.不要手动释放从函数返回的堆资源 假设你正在处理一个模拟Investment的程序库,不同的Investmetn类型从Investment基类继承而来, class Investment { ... }; // root class of hierarchy of // investment types 进一步假设这个程序库通过一个工厂函数(Item 7)来给我们提供特定Investment对象: Investment* createInvestment(); // return ptr to…
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 我确信我们都同意使用STL容器是一个好主意,并且我希望在Item 18中能让你相信使用std::unique_ptr也是一个好主意,但是我猜想,我们中没有任何一个人想多次写这样的类型:"std::unique_ptr<std::unordered_map<std::string, std::string>>".光是想想就感觉,得&…
1. Always use object to manage resource! If you delete a pointer or release a handler manually by yourself, there is great chance that you will make mistake or forget something. 2. There are two critical aspects of using object to manage resources: 2…