返回 const 引用参数而不复制
Returning const reference parameter without copying
我想要 return 一个重对象,我将其作为 const
引用传递而不复制。代码看起来像这样:
#include <iostream>
class heavy_obj {
public:
heavy_obj() {
std::cout << "Standard" << std::endl;
}
heavy_obj(const heavy_obj&) {
std::cout << "Copy" << std::endl;
}
heavy_obj(heavy_obj&& t) {
std::cout << "Move" << std::endl;
}
};
heavy_obj return_obj_or_default(const heavy_obj& t, bool ret) {
if(ret) {
return std::move(t); // Copy gets called here
} else {
return heavy_obj();
}
}
int main()
{
heavy_obj t {/* Something */};
heavy_obj t2 = return_obj_or_default(t, true);
heavy_obj t3 = return_obj_or_default(heavy_obj(/* Something Else */), true);
/* Output:
Standard
Copy
Standard
Copy
*/
return 0;
}
但是,如果我将移动构造函数声明为非 const
,如上所示,将调用复制构造函数,这是我不希望的。我可以删除函数 heavy_obj return_test(heavy_obj& t, bool ret)
中的 const
,但我无法再将右值作为参数传递。
如何实现我想要的行为?将移动构造函数的参数标记为 const
: heavy_obj(const heavy_obj&& t)
?虽然它与 this?
相矛盾
您不能从 const
值移动,因此该函数不能接受 const &
。
你可以这样做,所以调用者必须提供一个右值,移动或显式复制他们希望传递的左值。
heavy_obj return_obj_or_default(heavy_obj&& t, bool ret) {
if(ret) {
return std::move(t);
} else {
return heavy_obj();
}
}
或者你可以这样做,这样调用者就不必做任何特殊的事情,但它会隐式地复制左值。
heavy_obj return_obj_or_default(heavy_obj t, bool ret) {
if(ret) {
return std::move(t);
} else {
return heavy_obj();
}
}
我想要 return 一个重对象,我将其作为 const
引用传递而不复制。代码看起来像这样:
#include <iostream>
class heavy_obj {
public:
heavy_obj() {
std::cout << "Standard" << std::endl;
}
heavy_obj(const heavy_obj&) {
std::cout << "Copy" << std::endl;
}
heavy_obj(heavy_obj&& t) {
std::cout << "Move" << std::endl;
}
};
heavy_obj return_obj_or_default(const heavy_obj& t, bool ret) {
if(ret) {
return std::move(t); // Copy gets called here
} else {
return heavy_obj();
}
}
int main()
{
heavy_obj t {/* Something */};
heavy_obj t2 = return_obj_or_default(t, true);
heavy_obj t3 = return_obj_or_default(heavy_obj(/* Something Else */), true);
/* Output:
Standard
Copy
Standard
Copy
*/
return 0;
}
但是,如果我将移动构造函数声明为非 const
,如上所示,将调用复制构造函数,这是我不希望的。我可以删除函数 heavy_obj return_test(heavy_obj& t, bool ret)
中的 const
,但我无法再将右值作为参数传递。
如何实现我想要的行为?将移动构造函数的参数标记为 const
: heavy_obj(const heavy_obj&& t)
?虽然它与 this?
您不能从 const
值移动,因此该函数不能接受 const &
。
你可以这样做,所以调用者必须提供一个右值,移动或显式复制他们希望传递的左值。
heavy_obj return_obj_or_default(heavy_obj&& t, bool ret) {
if(ret) {
return std::move(t);
} else {
return heavy_obj();
}
}
或者你可以这样做,这样调用者就不必做任何特殊的事情,但它会隐式地复制左值。
heavy_obj return_obj_or_default(heavy_obj t, bool ret) {
if(ret) {
return std::move(t);
} else {
return heavy_obj();
}
}