C++11的几个点

右值引用

  • 左值是那种指向一块内存的表达式,可以通过&来取地址。右值则不能。右值只能用来赋值给左值。左值则可以赋值和被赋值。
  • X&只能接收左值,const X&可以接收左值和右值,X&&只能接收右值。
  • std::move直接将左值转为右值版本。
  • 尽可能多的使用move()。例如原地排序。
  • STL用来做容器元素的类型,经常被要求为可拷贝的,实际上很多情况下可移动就够了。例如 unique_pointer。
  • 定义为右值引用的物体,可以是右值也可以是左值,关键看它有没有“名字”。
    • 这一设计是考虑到 ,move是为了操作那些已经不再需要了的东西,但是又名字的话,在move结束后,依然会被用到,会很危险。
  • 编译器返回值优化:
    • 编译器会直接在返回点去创建将被返回的局部变量,不需要进行拷贝。
    • 这里返回move出的右值反而会抹杀这一优化。
  • 引用坍缩
    • A& & => A&
    • A&& & => A&
    • A& && => A&
    • A&& && => A&&
    • 对于 foo(T&&),当传参为左值 A,那么参数推导为 A&;当传参为右值 A,那么参数推导为 A&&。
  • 完美转发:
    • 传入函数的局部变量如果任由其自行析构,那么如果有其他变量握有它的一些引用,将会产生错误。
    • 过去的做法是分别写 A& 和 const A& 版本,但这样非常不灵活。
    • 现在可以使用 A&& 配合 std::forward 来做:
      template<class S> S&& forward(typename remove_reference<S>::type& a) noexcept
      {
      return static_cast<S&&>(a);
      }
    • 使用A&&后,左值以 T& 推导,于是T为A&,右值会以 T&&推导,亦即T为A。在forward中的推导,有恰好将这个&的数量反过来。于是,左值一路引用传参,右值经forward后变为右值再使用。不需要拷贝和析构了。
  • move是把参数转换成右值,而forward是配合template一起,把参数引用转换为参数引用、把右值保持为右值。
  • 感觉右值引用的核心就是引用坍缩。以此来保持参数的引用状态,从而避免赋值和析构。

参考:
http://thbecker.net/articles/rvalue_references/section_01.html

可变参数模板

定义:

template <class... T>
void F(T... args)

使用:

otherF(args...); //otherF也是一个具有可变参数的模板函数

展开可变参数模板的方法:
- 偏特化递归定义可变参数模板。注意定义递归终止函数。
- 逗号表达式。因为逗号表达式会按顺序执行逗号前面的表达式,那么利用已有的一些递归定义好了的可变参数函数(比如数组初始化函数),将逗号和0传进去(以便不引起语法错误),也可以获得展开。

匿名函数

  • 完整版的lambda函数实际上是一个重写了operator()的小型匿名类,所以显得像个函数。一个lambda函数就是一个实例。捕获的内容会记录在这个实例里边。
  • 如果并没有捕获任何东西,那么lambda会被编译为普通的函数,可以直接作为函数指针变量的右值。
  • 引用型捕获会是对象的一个引用,应当注意作用域和析构的问题。复制型对象会调用拷贝构造函数。
  • 将lambda传给foreach会有循环展开优化;
  • std::function
    • std::function<bool (const string&)> func
    • 它可以方便的表达lambda表达式。不需要一直用template来把lambda传来传去。
    • 如果想要为函数传递一部分参数,可以用带有捕获的lambda函数来初始化function。此时的参数可以“扩大”(更基类)(逆变Contravariance),返回值可以“缩小”(更子类)(协变Covariance)。

内存模型

暂略

其他

  • 将不需要的函数定义为delete/default: 包括构造析构、copy构造和copy operator=、move构造和move operator=。
    • 定义为delete的函数将不能被使用。
    • 定义为default的函数将默认规则生成。
  • decltype(i)、auto,自动类型推导。
  • range for:for(int & i: arr){}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值