返回 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();
    }
}