我是否需要重载接受rvalue引用的const左值引用的方法?

时间:2011-09-28 17:20:23

标签: c++ overloading rvalue-reference

目前我正在玩rvalue引用(C ++ 11,g ++与gnu ++ x0),我想在我的类中实现移动语义,因为它只是感觉“正确”。

我是否需要重载通常接受const左值引用的每个函数以从rvalue引用中受益?

让我们说这是我的示例类:

class Person {
public:
    Person() = default;
    Person(std::string &name);
    Person(const Person &rhs);
    Person(Person &&rhs);

    Person& operator=(const Person &rhs);
    Person& operator=(Person &&rhs);

    std::string& get_name() const;
    void set_name(const std::string &name);
private:
    std::string name_;
}

/* snip */

void Person::set_name(const std::string &name)
{
    this->name_ = name;
}

我现在想要使用带有右值引用的setter并消除不必要的副本。

Person test("Jon Doe");
test.set_name("Jon Doe2");

我真的需要以这种方式重载每个方法吗?

void Person::set_name(std::string &&name)
{
    this->name_ = std::move(name);
}

这对我来说似乎很多余。有没有办法更容易实现?

谢谢!

(我经常阅读stackoverflow,但这是我的第一个问题。所以如果我做错了,请告诉我。)

1 个答案:

答案 0 :(得分:5)

写一个功能。按价值收入,然后移动它。

void Person::set_name(std::string name)
{
    this->name_ = std::move(name);
}

让std :: string决定如何复制自己。