其实右值引用,move,右值构造的实质,从编译器的角度看,就是就是在栈上专门为这个将要作用于move概念做一个分配空间的过程,在使用时将其生命周期延长,ownership移交一下。不能使用堆上的变量做右值引用,因为如果使用了堆,就代表着有了地址,是左值。什么move啦,右值引用啦,只是在炒概念,迷惑了一大批人,将来还将继续迷惑人。希望大家看到输出自己的感想。
其实类似的还有shared pointer、unique pointer,steal类似的将使用权,移交出去或者计数。
而容器的右值赋值的作用在于,对于已经存在的数据,要充分利用,不要再根据已经存在的数据(内存),重新构造一份容器。要对比着非右值赋值的实现来看。
move的精髓还是在于两个方面:
- 一个是隐式临时变量的右值引用;
- 另一个在于主动对右值引用的创建;
libstdc+±v3/include/bits/move.h
/**
- @brief Convert a value to an rvalue.
- @param __t A thing of arbitrary type.
- @return The parameter cast to an rvalue-reference to allow moving it.
*/
template
constexpr typename