我最近读了很多关于右值引用和移动语义的内容。从我所见过的所有内容中,主要的应用是移动构造函数和移动赋值运算符。所以我问自己,如果你有一个已经有移动构造函数和移动赋值运算符的类型,那么用rvalues重载'normal'函数或者使用的类型的移动构造函数/赋值运算符是否足够是明智的
例如,如果我们考虑这段代码:
Image threshold(Image&& img){
//will be called for rvalues
//do something here that alters the image
return img;
}
Image threshold(Image img){
//this will be called for lvalues.
//now we have a local copy of img so we can forward it as rvalue to the other one
img = threshold(std::move(img));
return img;
}
现在,我们以这种方式使用它:
int main(){
Image img("filename.png");
Image img2;
//here the lvalue function will be called
img2 = threshold(img);
//here the rvalue function should be called
Image img3 = threshold(functionThatReturnsImage());
}
这种重载函数的方式是否有意义?或者它是多余的,因为类型Image
的移动构造函数和asignment运算符足以使值返回更有效(通过移动而不是复制返回)?
感谢您的帮助!