3.1.5 Move语义和Rvalue Reference

集合提供value semantic及安插“临时对象”或“安插后会被使用或被改动的对象”的能力:

X x;

coll.insert(x);//inserts copy of x

...

coll.insert(x+x);//inserts copy of temporary rvalue

...

coll.insert(x);//inserts copy of x(although x is not used any longer)

对后两次x的安插动作,更好的是指出“被传入值(也就是x+x的和以及x)不再被调用者使用“,如此一来coll内部就无须为它建立一份copy且”以某种方式move其内容进入新建元素中“。

std::move将实参转成一个所谓的rvalue reference。

欲初始化新的内部元素,只需提供一个所谓move构造函数,如果move构造函数不存在,copy构造函数就会被用上。

另外,你必须确保对于被传对象的任何改动都不能冲击新对象的状态。

STL容器保证了,被搬移内容者,搬移后其值为空。

rvalue和lvalue reference的重载规则:

如果只实现void f(X&)而没有实现void f(X&&),可因lvalue但不能因rvalue调用f。

如果只实现void f(const X&)而没有实现void f(X&&),可因lvalue也可因rvalue调用f。

如果同时实现void f(X&)、void f(X&&)或void f(const X&)、void f(X&&),可以区分是否提供move语义。

如果只是先void f(X&&),可因rvalue调用f,如果以lvalue调用,会触发编译错误。

返回rvalue reference:

不需要也不应该move返回值

X foo()

{

X x;

...

return x;

}

如果X有一个可用的copy或move构造函数,编译器略去copy版本,这就是返回值优化RVO,C++ 11之前就有很多编译器支持。

否则,如果X有一个move构造函数,X就被moved。

否则,如果X有一个copy构造函数,X就被copied。

否则,编译报错。

如果返回一个局部非静态对象,返回其rvalue reference是不对的。

您还未添加分享代码,请到主题选项中,添加百度分享代码!

您可以选择一种方式赞助本站

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

图片 表情