hao*_*ang 13 c++ return-value move-semantics c++11
我知道当按值将对象传递给函数时,如果存在构造函数,则始终调用移动构造函数,假设没有复制省略.如何按值返回对象?
例如,假设我们有一个Foo具有移动构造函数的类,并且我们有一个返回Foo对象的函数.
Foo g() {
Foo f;
// do something with f
return f;
}
Run Code Online (Sandbox Code Playgroud)
如果我们假设没有RVO,那么移动构造函数是否可以保证被调用?
更新:我想我没有明确表达我的意图.我只是想知道我可以在最坏的情况下移动对象而不是复制.无论是RVO还是NRVO,我很高兴.我还应该说移动构造函数和移动赋值不会被删除并且正确实现.
是。参见[class.copy] p32
当满足或将要执行复制操作的省略标准时,除非源对象是函数参数,并且要复制的对象由左值指定,选择重载构造函数的重载分辨率为首先执行,就好像该对象是由右值指定的。如果重载解析失败,或者所选构造函数的第一个参数的类型不是对该对象类型的右值引用(可能是cv限定),则将对象视为左值,再次执行重载解析。[ 注意:无论是否进行复制删除,都必须执行此两阶段的过载解决方案。如果不执行省略操作,它将确定要调用的构造函数,并且即使取消了调用,所选的构造函数也必须可访问。— 尾注 ]