gcc-4.9.2\libstdc++-v3\include\bits\stl_vector.h的代码:
/**
* @brief %Vector move constructor.
* @param __x A %vector of identical element and allocator types.
*
* The newly-created %vector contains the exact contents of @a __x.
* The contents of @a __x are a valid, but unspecified %vector.
*/
vector(vector&& __x) noexcept
: _Base(std::move(__x)) { }
问题来了,x是个rvalue reference啊,为什么要std::move(x),_Base(x)不能直接调用_Base(&&)么?
这个很多文章,视频,书都会讲到的,x是个rvalue reference,但它是个lvalue,所以必须std::move(x)
听上去总是很蛋疼,还是没讲明白为什么啊。
讲明白的如下:
lvalue和rvalue在标准的[basic.lval]:
Expressions are categorized according to the taxonomy in Figure 1
然后Figure 1华丽丽的给出了expression的lvalue,rvalue,glvalue,xvalue,prvalue。。。但是很明确的一点是,这个分类是针对expression的一套分类系统,和类型没有关系。而lvalue reference,rvalue reference显然是两个reference类型,从属于类型系统。
回到上面的代码,__x的类型毫无疑问是rvalue reference,然后__x这个expression是显然归属于lvalue的,所以才有了std::move(__x)的使用。