前面提到过,重载通用引用函数,得到的结果往往不是预期的,那么就应该以其它的方式来替代这种迷惑的方式。
Effective C++ :不要创建通用引用的重载函数
创建通用引用的重载函数,但很多时候还是会调用到通用引用函数,这会让人很迷惑。
Effective C++ :区分通用引用和右值引用
声明一个右值引用,使用T&&
这种格式,但是这玩意并不是表面上看到的那么简单。
1 | void f(Widget&& param); // 右值引用 |
Effective C++ :对右值引用使用 std::move,对通用引用使用 std::forward
当形参被声明为右值引用时,意味着传入的实参需要是右值引用,并且该参数是可移动的。既然目的如此明确,那么使用std::move
是正确的选择:
1 | class Widget { |
但如果形参被声明为通用引用时,则意味着实参有可能是右值引用,该参数有可能可被移动。那么对应的使用std::forward
是正确的选择:
1 | class Widget { |
Effective C++ :理解 std::move 和 std::forward
Effective C++ :尽可能的使用 constexpr
使用constexpr
以让编译器来检查该值是否是常量表达式,降低程序员负担。
Effective C++ :const iterators 优于 iterators
除非是需要修改容器元素的内容,否则在使用迭代器的时候,应该使用其const
版本,也就是指向const
类型元素的指针,以避免误操作。
Effective C++ :作用域枚举优于非作用域枚举
简单来讲就是对于枚举类型,也需要将其存放于命名空间中,以避免枚举中元素对外部标识符的污染。
Effective C++ :using 优于 typedef
在 c 中,typedef
是我经常使用的别名语法。但在 cpp 中,using
才是更好的选择。
Effective C++ :理解 auto
理解了 auto
的推导原则后,就需要认识到使用 auto
所带来的便利性和缺陷,才能正确的使用它。