经常看到有for(auto &&p : range)
的写法,但是不知道为什么这里要用右值引用,今天深究了一下。
vector< bool>的内存空间为节约存储,是按bit存储的,而不是byte,所以当vector< bool> c{false}; auto p = c[0]
时p的类型是一个std::vector< bool>:reference
对象,这不是一个左值。这也是为什么下列操作会编译出错的原因
vector<bool> c{ false, true, false, true, false };
bool &tmp = c[0]; //错误,不能编译,对于引用来说,因为c[0]不是一个左值
bool *p = &c[0]; //错误,不能编译,因为无法将一个临时量地址给绑定到指针
另外
auto p = c[0];// 当改变p时,c[0]也将发生改变。这是因为std::vector< bool>:reference对象具有引用的特性
基于此
vector< bool> c{false};
for(auto &i : c)会报错。
但是右值引用可以绑定到std::vector< bool>:reference对象上
因此更有效,并且正确,并且具有普适性的版本出来了。
vector< bool> c{false};
for(auto &&i : c)
参考链接:https://edmundv.home.xs4all.nl/blog/2014/01/28/use-auto-and-and-for-range-based-for-loops/