2011年5月8日 星期日

左值右值

左值右值

真是绅士一般的优雅XD

http://blog.csdn.net/FlowShell/archive/2010/12/08/6062537.aspx

std::vector(9),std::deque(),……都是可以改变的右值。在Herb Sutter的《More Exceptional C++》中的条款7的page51页有这样几行代码:

vector c( 10000 );

c.erase( c.begin()+10, c.end() );

vector( c ).swap( c );

认真看几遍,你会发现但vector的大小增大到一定程度,你又用不着这么多空间的时候,你会想办法把它收缩到最合适的大小,但利用别的办法比如调用成员函数reserve()都无法办到,这个时候就必须利用右值可以改变这个性质了。

vector( c ).swap( c );这行代码就是点睛之处。

首先使用复制构造函数生成临时右值vector( c ),这个右值正好是合适大小,然后和c交换【注5】,c就变成合适大小了,最后在整个表达式结束的时候,这个临时右值析构归还内存空间。真是绅士一般的优雅!

注5:这个时候这个临时右值就发生了改变。

沒有留言:

張貼留言